C〓〓〓解析JSON方法まとめ

33606 ワード

主な参考http://blog.csdn.net/joyhen/article/details/24805899和http://www.cnblogs.com/yanweidie/p/4605212.html
自分の需要に応じて、テスト、修正、整理をします.
Newtonift.Jsonを使用します.
一、JsonConvertで序列化と反前列化する.
実体類は特殊な処理を使わず、属性を正常に定義すればよく、制御属性は逐次化されているかどうかは高級用法1を参照してください.
    public interface IPerson
    {
        string FirstName
        {
            get;
            set;
        }
        string LastName
        {
            get;
            set;
        }
        DateTime BirthDate
        {
            get;
            set;
        }
    }
    public class Employee : IPerson
    {
        public string FirstName
        {
            get;
            set;
        }
        public string LastName
        {
            get;
            set;
        }
        public DateTime BirthDate
        {
            get;
            set;
        }

        public string Department
        {
            get;
            set;
        }
        public string JobTitle
        {
            get;
            set;
        }

        public string NotSerialize { get; set; }
    }
    public class PersonConverter : Newtonsoft.Json.Converters.CustomCreationConverter
    {
        //  abstract class CustomCreationConverter Create  
        public override IPerson Create(Type objectType)
        {
            return new Employee();
        }
    }
    public class Product
    {
        public string Name { get; set; }
        public DateTime Expiry { get; set; }
        public Decimal Price { get; set; }
        public string[] Sizes { get; set; }
        public string NotSerialize { get; set; }
    }
1.プログレッシブコード:
        #region      JsonConvert
        public string TestJsonSerialize()
        {
            Product product = new Product();
            product.Name = "Apple";
            product.Expiry = DateTime.Now;//.AddDays(3).ToString("yyyy-MM-dd hh:mm:ss");
            product.Price = 3.99M;

            //string json = Newtonsoft.Json.JsonConvert.SerializeObject(product); //      
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(product, Newtonsoft.Json.Formatting.Indented);//     
            //string json = Newtonsoft.Json.JsonConvert.SerializeObject(
            //    product,
            //    Newtonsoft.Json.Formatting.Indented,
            //    new Newtonsoft.Json.JsonSerializerSettings { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore }//         JsonSerializerSettings  
            //);
            return json;
        }
        public string TestListJsonSerialize()
        {
            Product product = new Product();
            product.Name = "Apple";
            product.Expiry = DateTime.Now;//.AddDays(3).ToString("yyyy-MM-dd hh:mm:ss");
            product.Price = 3.99M;
            product.Sizes = new string[] { "Small", "Medium", "Large" };

            List plist = new List();
            plist.Add(product);
            plist.Add(product);
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(plist, Newtonsoft.Json.Formatting.Indented);
            return json;
        }
        #endregion
2.アンチプログレッシブコード:
        #region       JsonConvert
        public string TestJsonDeserialize()
        {
            string strjson = "{\"Name\":\"Apple\",\"Expiry\":\"2014-05-03 10:20:59\",\"Price\":3.99,\"Sizes\":[\"Small\",\"Medium\",\"Large\"]}";
            Product p = Newtonsoft.Json.JsonConvert.DeserializeObject(strjson);

            string template = @"
                                    Name:{0}
                                    Expiry:{1}
                                    Price:{2}
                                    Sizes:{3}
                                ";

            return string.Format(template, p.Name, p.Expiry, p.Price.ToString(), string.Join(",", p.Sizes));
        }
        public string TestListJsonDeserialize()
        {
            string strjson = "{\"Name\":\"Apple\",\"Expiry\":\"2014-05-03 10:20:59\",\"Price\":3.99,\"Sizes\":[\"Small\",\"Medium\",\"Large\"]}";
            List plist = Newtonsoft.Json.JsonConvert.DeserializeObject>(string.Format("[{0},{1}]", strjson, strjson));

            string template = @"
                                    Name:{0}
                                    Expiry:{1}
                                    Price:{2}
                                    Sizes:{3}
                                ";

            System.Text.StringBuilder strb = new System.Text.StringBuilder();
            plist.ForEach(x =>
                strb.AppendLine(
                    string.Format(template, x.Name, x.Expiry, x.Price.ToString(), string.Join(",", x.Sizes))
                )
            );
            return strb.ToString();
        }
        #endregion
3.カスタムプロローグは、エンティティクラスで定義されているPersonConverterを使用して、逆プログレッシブ化されるごとにエンティティが呼び出されます.PersonCoverterは、どうやって使うかまだ分かりません.
        #region        
        public string TestListCustomDeserialize()
        {
            string strJson = "[ { \"FirstName\": \"Maurice\", \"LastName\": \"Moss\", \"BirthDate\": \"1981-03-08T00:00Z\", \"Department\": \"IT\", \"JobTitle\": \"Support\" }, { \"FirstName\": \"Jen\", \"LastName\": \"Barber\", \"BirthDate\": \"1985-12-10T00:00Z\", \"Department\": \"IT\", \"JobTitle\": \"Manager\" } ] ";
            List people = Newtonsoft.Json.JsonConvert.DeserializeObject>(strJson, new PersonConverter());
            IPerson person = people[0];

            string template = @"
                                      List[x]    :{0}
                                    FirstName:{1}
                                    LastName:{2}
                                    BirthDate:{3}
                                    Department:{4}
                                    JobTitle:{5}
                                ";

            System.Text.StringBuilder strb = new System.Text.StringBuilder();
            people.ForEach(x =>
                strb.AppendLine(
                    string.Format(
                        template,
                        person.GetType().ToString(),
                        x.FirstName,
                        x.LastName,
                        x.BirthDate.ToString(),
                        ((Employee)x).Department,
                        ((Employee)x).JobTitle
                    )
                )
            );
            return strb.ToString();
        }
        #endregion
4、Json文字列の一部を取得する
       #region Serializing Partial JSON Fragment Example
        public class SearchResult
        {
            public string Title { get; set; }
            public string Content { get; set; }
            public string Url { get; set; }
        }

        public string SerializingJsonFragment()
        {
            #region
            string googleSearchText = @"{
                'responseData': {
                    'results': [{
                        'GsearchResultClass': 'GwebSearch',
                        'unescapedUrl': 'http://en.wikipedia.org/wiki/Paris_Hilton',
                        'url': 'http://en.wikipedia.org/wiki/Paris_Hilton',
                        'visibleUrl': 'en.wikipedia.org',
                        'cacheUrl': 'http://www.google.com/search?q=cache:TwrPfhd22hYJ:en.wikipedia.org',
                        'title': 'Paris Hilton - Wikipedia, the free encyclopedia',
                        'titleNoFormatting': 'Paris Hilton - Wikipedia, the free encyclopedia',
                        'content': '[1] In 2006, she released her debut album...'
                    },
                    {
                        'GsearchResultClass': 'GwebSearch',
                        'unescapedUrl': 'http://www.imdb.com/name/nm0385296/',
                        'url': 'http://www.imdb.com/name/nm0385296/',
                        'visibleUrl': 'www.imdb.com',
                        'cacheUrl': 'http://www.google.com/search?q=cache:1i34KkqnsooJ:www.imdb.com',
                        'title': 'Paris Hilton',
                        'titleNoFormatting': 'Paris Hilton',
                        'content': 'Self: Zoolander. Socialite Paris Hilton...'
                    }],
                    'cursor': {
                        'pages': [{
                            'start': '0',
                            'label': 1
                        },
                        {
                            'start': '4',
                            'label': 2
                        },
                        {
                            'start': '8',
                            'label': 3
                        },
                        {
                            'start': '12',
                            'label': 4
                        }],
                        'estimatedResultCount': '59600000',
                        'currentPageIndex': 0,
                        'moreResultsUrl': 'http://www.google.com/search?oe=utf8&ie=utf8...'
                    }
                },
                'responseDetails': null,
                'responseStatus': 200
            }";
            #endregion

            Newtonsoft.Json.Linq.JObject googleSearch = Newtonsoft.Json.Linq.JObject.Parse(googleSearchText);
            // get JSON result objects into a list
            List listJToken = googleSearch["responseData"]["results"].Children().ToList();
            System.Text.StringBuilder strb = new System.Text.StringBuilder();
            string template = @"
                                    Title:{0}
                                    Content: {1}
                                    Url:{2}
                                ";
            listJToken.ForEach(x =>
            {
                // serialize JSON results into .NET objects
                SearchResult searchResult = Newtonsoft.Json.JsonConvert.DeserializeObject(x.ToString());
                strb.AppendLine(string.Format(template, searchResult.Title, searchResult.Content, searchResult.Url));
            });
            return strb.ToString();
        }

        #endregion
出力結果
                                    Title:Paris Hilton - Wikipedia, the free encyclopedia
                                    Content: [1] In 2006, she released her debut album...
                                    Url:http://en.wikipedia.org/wiki/Paris_Hilton
                                

                                    Title:Paris Hilton
                                    Content: Self: Zoolander. Socialite Paris Hilton...
                                    Url:http://www.imdb.com/name/nm0385296/
5、Json.Linqを利用して順番に並べます.
エンティティクラスの制限を突破することができます.自由な組み合わせは、順序付けされた値になります.
    public class Linq2Json
    {
        #region GetJObject

        //Parsing a JSON Object from text 
        public Newtonsoft.Json.Linq.JObject GetJObject()
        {
            string json = @"{
                              CPU: 'Intel',
                              Drives: [
                                'DVD read/writer',
                                '500 gigabyte hard drive'
                              ]
                            }";
            Newtonsoft.Json.Linq.JObject jobject = Newtonsoft.Json.Linq.JObject.Parse(json);
            return jobject;
        }

        /* 
         * //example:=>
         * 
            Linq2Json l2j = new Linq2Json();
            Newtonsoft.Json.Linq.JObject jobject = l2j.GetJObject2(Server.MapPath("json/Person.json"));
            //return Newtonsoft.Json.JsonConvert.SerializeObject(jobject, Newtonsoft.Json.Formatting.Indented);
            return jobject.ToString();
         */
        //Loading JSON from a file
        public Newtonsoft.Json.Linq.JObject GetJObject2(string jsonPath)
        {
            using (System.IO.StreamReader reader = System.IO.File.OpenText(jsonPath))
            {
                Newtonsoft.Json.Linq.JObject jobject = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.Linq.JToken.ReadFrom(new Newtonsoft.Json.JsonTextReader(reader));
                return jobject;
            }
        }

        //Creating JObject
        public Newtonsoft.Json.Linq.JObject GetJObject3()
        {
            List posts = GetPosts();
            Newtonsoft.Json.Linq.JObject jobject = Newtonsoft.Json.Linq.JObject.FromObject(new
            {
                channel = new
                {
                    title = "James Newton-King",
                    link = "http://james.newtonking.com",
                    description = "James Newton-King's blog.",
                    item =
                        from p in posts
                        orderby p.Title
                        select new
                        {
                            title = p.Title,
                            description = p.Description,
                            link = p.Link,
                            category = p.Category
                        }
                }
            });

            return jobject;
        }
        /*
            {
                "channel": {
                    "title": "James Newton-King",
                    "link": "http://james.newtonking.com",
                    "description": "James Newton-King's blog.",
                    "item": [{
                        "title": "jewron",
                        "description": "4546fds",
                        "link": "http://www.baidu.com",
                        "category": "jhgj"
                    },
                    {
                        "title": "jofdsn",
                        "description": "mdsfan",
                        "link": "http://www.baidu.com",
                        "category": "6546"
                    },
                    {
                        "title": "jokjn",
                        "description": "m3214an",
                        "link": "http://www.baidu.com",
                        "category": "hg425"
                    },
                    {
                        "title": "jon",
                        "description": "man",
                        "link": "http://www.baidu.com",
                        "category": "goodman"
                    }]
                }
            }
         */
        //Creating JObject
        public Newtonsoft.Json.Linq.JObject GetJObject4()
        {
            List posts = GetPosts();
            Newtonsoft.Json.Linq.JObject rss = new Newtonsoft.Json.Linq.JObject(
                    new Newtonsoft.Json.Linq.JProperty("channel",
                        new Newtonsoft.Json.Linq.JObject(
                            new Newtonsoft.Json.Linq.JProperty("title", "James Newton-King"),
                            new Newtonsoft.Json.Linq.JProperty("link", "http://james.newtonking.com"),
                            new Newtonsoft.Json.Linq.JProperty("description", "James Newton-King's blog."),
                            new Newtonsoft.Json.Linq.JProperty("item",
                                new Newtonsoft.Json.Linq.JArray(
                                    from p in posts
                                    orderby p.Title
                                    select new Newtonsoft.Json.Linq.JObject(
                                        new Newtonsoft.Json.Linq.JProperty("title", p.Title),
                                        new Newtonsoft.Json.Linq.JProperty("description", p.Description),
                                        new Newtonsoft.Json.Linq.JProperty("link", p.Link),
                                        new Newtonsoft.Json.Linq.JProperty("category",
                                            new Newtonsoft.Json.Linq.JArray(
                                                from c in p.Category
                                                select new Newtonsoft.Json.Linq.JValue(c)
                                            )
                                        )
                                    )
                                )
                            )
                        )
                    )
                );

            return rss;
        }
        /*
            {
                "channel": {
                    "title": "James Newton-King",
                    "link": "http://james.newtonking.com",
                    "description": "James Newton-King's blog.",
                    "item": [{
                        "title": "jewron",
                        "description": "4546fds",
                        "link": "http://www.baidu.com",
                        "category": ["j", "h", "g", "j"]
                    },
                    {
                        "title": "jofdsn",
                        "description": "mdsfan",
                        "link": "http://www.baidu.com",
                        "category": ["6", "5", "4", "6"]
                    },
                    {
                        "title": "jokjn",
                        "description": "m3214an",
                        "link": "http://www.baidu.com",
                        "category": ["h", "g", "4", "2", "5"]
                    },
                    {
                        "title": "jon",
                        "description": "man",
                        "link": "http://www.baidu.com",
                        "category": ["g", "o", "o", "d", "m", "a", "n"]
                    }]
                }
            }
         */

        public class Post
        {
            public string Title { get; set; }
            public string Description { get; set; }
            public string Link { get; set; }
            public string Category { get; set; }
        }
        private List GetPosts()
        {
            List listp = new List()
            {
                new Post{Title="jon",Description="man",Link="http://www.baidu.com",Category="goodman"},
                new Post{Title="jofdsn",Description="mdsfan",Link="http://www.baidu.com",Category="6546"},
                new Post{Title="jewron",Description="4546fds",Link="http://www.baidu.com",Category="jhgj"},
                new Post{Title="jokjn",Description="m3214an",Link="http://www.baidu.com",Category="hg425"}
            };
            return listp;
        }

        #endregion

        #region GetJArray
        /*
         * //example:=>
         * 
            Linq2Json l2j = new Linq2Json();
            Newtonsoft.Json.Linq.JArray jarray = l2j.GetJArray();
            return Newtonsoft.Json.JsonConvert.SerializeObject(jarray, Newtonsoft.Json.Formatting.Indented);
            //return jarray.ToString();
         */
        //Parsing a JSON Array from text 
        public Newtonsoft.Json.Linq.JArray GetJArray()
        {
            string json = @"[
                              'Small',
                              'Medium',
                              'Large'
                            ]";

            Newtonsoft.Json.Linq.JArray jarray = Newtonsoft.Json.Linq.JArray.Parse(json);
            return jarray;
        }

        //Creating JArray
        public Newtonsoft.Json.Linq.JArray GetJArray2()
        {
            Newtonsoft.Json.Linq.JArray array = new Newtonsoft.Json.Linq.JArray();
            Newtonsoft.Json.Linq.JValue text = new Newtonsoft.Json.Linq.JValue("Manual text");
            Newtonsoft.Json.Linq.JValue date = new Newtonsoft.Json.Linq.JValue(new DateTime(2000, 5, 23));
            //add to JArray
            array.Add(text);
            array.Add(date);

            return array;
        }

        #endregion

    }
使い方
            Linq2Json l2j = new Linq2Json();
            Newtonsoft.Json.Linq.JObject jarray = l2j.GetJObject4();
            return jarray.ToString();
二、高級用法
1.一部の属性を無視する
エンティティクラスには多くの属性が定義されていますが、プログレッシブにはいくつかの属性に対してのみ適用されます.このような需要は、運転時に異なる時刻において、プログレッシブ属性のセットに参加する不定と固定の2つの状況にも細分化することができる.
1)序列化属性セットの固定に参加する状況を解決することができます.
OptOut    デフォルトの値は、クラスのすべての共有メンバーが、順序付けされます.順序付けされたくないなら、特性Jsonignore OptInを使ってもいいです.    デフォルトでは、すべてのメンバーは、プログレッシブされません.クラスのメンバーは、プログレッシブされています.クラスのメンバーが多い場合には、クライアントがデータの一部を必要とするだけで有用です.
名前の属性のみが必要です.
    [JsonObject(MemberSerialization.OptIn)]
    public class Person
    {
        public int Age { get; set; }

        [JsonProperty]
        public string Name { get; set; }

        public string Sex { get; set; }

        public bool IsMarry { get; set; }

        public DateTime Birthday { get; set; }
    }
出力結果

結婚の属性は必要ありません.
    [JsonObject(MemberSerialization.OptOut)]
    public class Person
    {
        public int Age { get; set; }

        public string Name { get; set; }

        public string Sex { get; set; }

        [JsonIgnore]
        public bool IsMarry { get; set; }

        public DateTime Birthday { get; set; }
    }
出力結果

上記の例では、いくつかの属性に戻らないための需要を実現するのは簡単です.1.実体類に[JsonObject]を加えます.2.戻る必要がない属性に[JsonIgnore]を付けて説明します.
2)序列化属性の集合が固定されていない場合を解決することができる.
方法1:デフォルトの値属性を無視する方式を設定します.ちょっとおバカ
方法2:デフォルトのDefault ContractResoulver類を継承し、輸入には出力が必要な属性があります.
2、標準値
属性のデフォルト値を設定し、その後、プログレッシブまたはアンチプログレッシブにおいて、デフォルト値を自動的に判断し、デフォルト値を持つ属性のプログレッシブまたは逆プログレッシブを無視するかどうかを選択します.
プログレッシブ時にデフォルトの属性を無視したい場合は、Json Serializer Settings.DefaultValueHandlingにより、エニュメレーション値として決定されます.
DefaultValue Handling.Ignore    プログレッシブとアンチプログレッシブの場合、デフォルト値DefaultValue Handling.Includeを無視します.    プログレッシブと反プログレッシブの場合は、標準値が含まれます.
[DefaultValue(10)]
 public int Age { get; set; }
 Person p = new Person { Age = 10, Name = "   ", Sex = " ", IsMarry = false, Birthday = new DateTime(1991, 1, 2) };
 JsonSerializerSettings jsetting=new JsonSerializerSettings();
 jsetting.DefaultValueHandling=DefaultValueHandling.Ignore;
 Console.WriteLine(JsonConvert.SerializeObject(p, Formatting.Indented, jsetting));
出力結果

3、空の値
デフォルトと同様に、空の値に対する属性の順序付けまたは逆順序化を無視するかどうかを選択できます.
プログレッシブには値NULLの属性を無視する必要があります.Json Serializer Settings.NullValue Handlingによって決定できます.また、Json Serializer Settingsによる属性設定はプログレッシブ過程ですべての属性に対して有効になります.
1)Json SerializerSettings.Null Value Handling方式は、エンティティ内のすべての空の値パラメータを無視します.
Person p = new Person { room=null,Age = 10, Name = "   ", Sex = " ", IsMarry = false, Birthday = new DateTime(1991, 1, 2) };
 JsonSerializerSettings jsetting=new JsonSerializerSettings();
 jsetting.NullValueHandling = NullValueHandling.Ignore;
 Console.WriteLine(JsonConvert.SerializeObject(p, Formatting.Indented, jsetting));
上記の例ではプログレッシブroomは行われません.
2)JsonPropertyは、特定の属性を無視する
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
 public Room room { get; set; }
4、非公開属性のサポート
[JsonProperty]
 private int Height { get; set; }
5、日付
Dateimeタイプの日付のフォーマットは面倒です.システムが持参するのはiso日付標準にフォーマットされますが、実際の使用過程ではyyy-M-ddまたはyyyy-M-dd HH:mm:ssの2つのフォーマットの日付で、解決方法はDateTimeタイプをstringタイプに変更して自分でフォーマットして、それから順番に並べます.コードを修正したくないなら、次の案を採用して実現できます.
      Json.NetはIsoDateTimeConverter日付変換というクラスを提供しています.JsnCoverterを通じて日付変換が可能です.
   [JsonConverter(typeof(IsoDateTimeConverter))]
    public DateTime Birthday { get; set; }
ですが、IsoDateTimeConverterの日付フォーマットは私達が望んでいないです.このクラスを引き継いで自分の日付を実現できます.
    public class ChinaDateTimeConverter : DateTimeConverterBase
    {
        private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return dtConverter.ReadJson(reader, objectType, existingValue, serializer);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            dtConverter.WriteJson(writer, value, serializer);
        }
    }
自分で一つのyyyy-M-ddフォーマットの転換種類を実現しました.IsoDateTimeConverterを初期化する時にあげる日付フォーマットはyy-M-ddだけでいいです.以下の効果を見てください.
[JsonConverter(typeof(ChinaDateTimeConverter))]
public DateTime Birthday { get; set; }
C# 解析JSON方法总结_第1张图片
日付処理は、グローバルJsonConvert.Default Settingsを設定することにより、Json Serializer Settings.DateFormaString=「yyy-M-dd HH:mm:ss」を設定することもできます.6、カスタムの順序化時の属性名
Data MemberのPropertyNameと同じです.
エンティティで定義されている属性名は、自分の名前ではないかもしれませんが、エンティティ定義を変更することはできません.
     [JsonProperty(PropertyName = "CName")]
     public string Name { get; set; }
7、列挙値のカスタムフォーマット
デフォルトでは、エンティティ内のエニュメレート・タイプのシステムは、エニュメレーションに対応する整数値にフォーマットされていますが、エニュメレート・コンティニュレーションに対応する文字はどうなりますか?
    public enum NotifyType
    {
        /// 
        /// Emil  
        /// 
        Mail=0,

        /// 
        ///     
        /// 
        SMS=1
    }
    public class TestEnmu
    {
        /// 
        ///       
        /// 
        [JsonConverter(typeof(StringEnumConverter))]
        public NotifyType Type { get; set; }
    }
出力結果

8、カスタムタイプの変換
デフォルトでは、エンティティ内のBooleanシステムはtrueまたはfalseにフォーマットされています.trueに対して「はい」falseを「いいえ」に変更する需要はどうやって実現されますか?私たちはカスタムタイプの変換でこの需要を実現できます.実例を見てみます.
    public class BoolConvert : JsonConverter
    {
        private string[] arrBString { get; set; }

        public BoolConvert()
        {
            arrBString = " , ".Split(',');
        }

        /// 
        ///     
        /// 
        ///  bool         
        public BoolConvert(string BooleanString)
        {
            if (string.IsNullOrEmpty(BooleanString))
            {
                throw new ArgumentNullException();
            }
            arrBString = BooleanString.Split(',');
            if (arrBString.Length != 2)
            {
                throw new ArgumentException("BooleanString       ");
            }
        }


        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            bool isNullable = IsNullableType(objectType);
            Type t = isNullable ? Nullable.GetUnderlyingType(objectType) : objectType;

            if (reader.TokenType == JsonToken.Null)
            {
                if (!IsNullableType(objectType))
                {
                    throw new Exception(string.Format("    null value to {0}.", objectType));
                }

                return null;
            }

            try
            {
                if (reader.TokenType == JsonToken.String)
                {
                    string boolText = reader.Value.ToString();
                    if (boolText.Equals(arrBString[0], StringComparison.OrdinalIgnoreCase))
                    {
                        return true;
                    }
                    else if (boolText.Equals(arrBString[1], StringComparison.OrdinalIgnoreCase))
                    {
                        return false;
                    }
                }

                if (reader.TokenType == JsonToken.Integer)
                {
                    //  
                    return Convert.ToInt32(reader.Value) == 1;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Error converting value {0} to type '{1}'", reader.Value, objectType));
            }
            throw new Exception(string.Format("Unexpected token {0} when parsing enum", reader.TokenType));
        }

        /// 
        ///      Bool  
        /// 
        ///   
        ///  bool         
        public override bool CanConvert(Type objectType)
        {
            return true;
        }


        public bool IsNullableType(Type t)
        {
            if (t == null)
            {
                throw new ArgumentNullException("t");
            }
            return (t.BaseType.FullName=="System.ValueType" && t.GetGenericTypeDefinition() == typeof(Nullable<>));
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }

            bool bValue = (bool)value;

            if (bValue)
            {
                writer.WriteValue(arrBString[0]);
            }
            else
            {
                writer.WriteValue(arrBString[1]);
            }
        }
    }
BoolConvertタイプをカスタマイズし、Json Coverterから継承します.構造関数パラメータBoolean Stringは、true falseを対応する文字列に変換するようにカスタマイズできます.このカスタム変換タイプは本体の中でどう使いますか?
    public class Person
    {
        [JsonConverter(typeof(BoolConvert))]
        public bool IsMarry { get; set; }
    }

どのような個性的な変換ニーズがあるかに応じて、カスタマイズした変換タイプの方式で実現できます.
9、グローバルプログレッシブ設定
グローバルデフォルトJson SerializerSettingsの設定に対して、どこも同じコードを設定する手間が省けます.
   Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
   JsonConvert.DefaultSettings = new Func(() =>
   {
    //           
     setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
      setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";

    //    
      setting.NullValueHandling = NullValueHandling.Ignore;

      //       Bool       
      setting.Converters.Add(new BoolConvert(" , "));

      return setting;
   });