C〓〓〓解析JSON方法まとめ
33606 ワード
主な参考http://blog.csdn.net/joyhen/article/details/24805899和http://www.cnblogs.com/yanweidie/p/4605212.html
自分の需要に応じて、テスト、修正、整理をします.
Newtonift.Jsonを使用します.
一、JsonConvertで序列化と反前列化する.
実体類は特殊な処理を使わず、属性を正常に定義すればよく、制御属性は逐次化されているかどうかは高級用法1を参照してください.
エンティティクラスの制限を突破することができます.自由な組み合わせは、順序付けされた値になります.
1.一部の属性を無視する
エンティティクラスには多くの属性が定義されていますが、プログレッシブにはいくつかの属性に対してのみ適用されます.このような需要は、運転時に異なる時刻において、プログレッシブ属性のセットに参加する不定と固定の2つの状況にも細分化することができる.
1)序列化属性セットの固定に参加する状況を解決することができます.
OptOut デフォルトの値は、クラスのすべての共有メンバーが、順序付けされます.順序付けされたくないなら、特性Jsonignore OptInを使ってもいいです. デフォルトでは、すべてのメンバーは、プログレッシブされません.クラスのメンバーは、プログレッシブされています.クラスのメンバーが多い場合には、クライアントがデータの一部を必要とするだけで有用です.
名前の属性のみが必要です.
結婚の属性は必要ありません.
上記の例では、いくつかの属性に戻らないための需要を実現するのは簡単です.1.実体類に[JsonObject]を加えます.2.戻る必要がない属性に[JsonIgnore]を付けて説明します.
2)序列化属性の集合が固定されていない場合を解決することができる.
方法1:デフォルトの値属性を無視する方式を設定します.ちょっとおバカ
方法2:デフォルトのDefault ContractResoulver類を継承し、輸入には出力が必要な属性があります.
2、標準値
属性のデフォルト値を設定し、その後、プログレッシブまたはアンチプログレッシブにおいて、デフォルト値を自動的に判断し、デフォルト値を持つ属性のプログレッシブまたは逆プログレッシブを無視するかどうかを選択します.
プログレッシブ時にデフォルトの属性を無視したい場合は、Json Serializer Settings.DefaultValueHandlingにより、エニュメレーション値として決定されます.
DefaultValue Handling.Ignore プログレッシブとアンチプログレッシブの場合、デフォルト値DefaultValue Handling.Includeを無視します. プログレッシブと反プログレッシブの場合は、標準値が含まれます.
3、空の値
デフォルトと同様に、空の値に対する属性の順序付けまたは逆順序化を無視するかどうかを選択できます.
プログレッシブには値NULLの属性を無視する必要があります.Json Serializer Settings.NullValue Handlingによって決定できます.また、Json Serializer Settingsによる属性設定はプログレッシブ過程ですべての属性に対して有効になります.
1)Json SerializerSettings.Null Value Handling方式は、エンティティ内のすべての空の値パラメータを無視します.
2)JsonPropertyは、特定の属性を無視する
Dateimeタイプの日付のフォーマットは面倒です.システムが持参するのはiso日付標準にフォーマットされますが、実際の使用過程ではyyy-M-ddまたはyyyy-M-dd HH:mm:ssの2つのフォーマットの日付で、解決方法はDateTimeタイプをstringタイプに変更して自分でフォーマットして、それから順番に並べます.コードを修正したくないなら、次の案を採用して実現できます.
Json.NetはIsoDateTimeConverter日付変換というクラスを提供しています.JsnCoverterを通じて日付変換が可能です.
日付処理は、グローバルJsonConvert.Default Settingsを設定することにより、Json Serializer Settings.DateFormaString=「yyy-M-dd HH:mm:ss」を設定することもできます.6、カスタムの順序化時の属性名
Data MemberのPropertyNameと同じです.
エンティティで定義されている属性名は、自分の名前ではないかもしれませんが、エンティティ定義を変更することはできません.
デフォルトでは、エンティティ内のエニュメレート・タイプのシステムは、エニュメレーションに対応する整数値にフォーマットされていますが、エニュメレート・コンティニュレーションに対応する文字はどうなりますか?
8、カスタムタイプの変換
デフォルトでは、エンティティ内のBooleanシステムはtrueまたはfalseにフォーマットされています.trueに対して「はい」falseを「いいえ」に変更する需要はどうやって実現されますか?私たちはカスタムタイプの変換でこの需要を実現できます.実例を見てみます.
どのような個性的な変換ニーズがあるかに応じて、カスタマイズした変換タイプの方式で実現できます.
9、グローバルプログレッシブ設定
グローバルデフォルトJson SerializerSettingsの設定に対して、どこも同じコードを設定する手間が省けます.
自分の需要に応じて、テスト、修正、整理をします.
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; }
日付処理は、グローバル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;
});