1.JSON序列化javascript
string JsonStr= JsonConvert.SerializeObject(Entity);java
eg:json
A a=new A(); a.Name="Elain00"; a.Hobby="eat eat"; string jsonStr=JsonConvert.SerializeObject(a);
2.JSON反序列化ide
string jsonstr = "jsonString";
Class model = JsonConvert.DeserializeObject<Class>(jsonstr);oop
eg:post
string JsonStr='"{\'Name\':\'Elaine00\',\'Hobby\':\'eat eat\'}"; A a=JsonConvert.DeserializeObject<A>(JsonStr);
3.時間格式處理this
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; Response.Write(JsonConvert.SerializeObject(bll.GetModelList(strWhere), Newtonsoft.Json.Formatting.Indented, timeFormat));
4.擴展方法spa
public static class NewtonJSONHelper { public static string SerializeObject(this object obj) { return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings{ ReferenceLoopHandling = ReferenceLoopHandling.Ignore}); } public static T DeserializeObject<T>(this string data) { return JsonConvert.DeserializeObject<T>(data, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); } }
5.日期處理code
public class LogEntry { public string Details { get; set; } public DateTime LogDate { get; set; } } public void WriteJsonDates() { LogEntry entry = new LogEntry { LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc), Details = "Application started." }; // default as of Json.NET 4.5 string isoJson = JsonConvert.SerializeObject(entry); // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"} JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.Micro
public class LimitPropsContractResolver : DefaultContractResolver { private string[] props = null; public LimitPropsContractResolver(string[] props) { this.props = props; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> list = base.CreateProperties(type, memberSerialization); IsoDateTimeConverter iso = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; IList<JsonProperty> listWithConver = new List<JsonProperty>(); foreach (var item in list) { if (props.Contains(item.PropertyName)) { if (item.PropertyType.ToString().Contains("System.DateTime")) { item.Converter = iso; } listWithConver.Add(item); } } return listWithConver; } } }
softDateFormat }; string microsoftJson = JsonConvert.SerializeObject(entry, microsoftDateFormatSettings); // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"} string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter()); // {"Details":"Application started.","LogDate":new Date(1234656000000)} }
2.JSON反序列化 string jsonstr = "jsonString"; Class model = JsonConvert.DeserializeObject<Class>(jsonstr); eg: string JsonStr='"{\'Name\':\'Elaine00\',\'Hobby\':\'eat eat\'}"; A a=JsonConvert.DeserializeObject<A>(JsonStr);
通常是對於值類型的處理,經過設置jSetting.DefaultValueHandling的值來肯定,該值爲枚舉類型.orm
DefaultValueHandling.Ignore |
序列化和反序列化時,忽略默認值 |
DefaultValueHandling.Include |
序列化和反序列化時,包含默認值 |
給成員設置默任值,用到"DefaultValue(value)"特性,固然別忘了引入命名空間"System.ComponentModel",假設員工的年齡默認值爲30
[DefaultValue(30)] public int Age { get; set; }
序列化時我想忽略爲默認值的成員
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null }; var jSetting = new JsonSerializerSettings(); jSetting.DefaultValueHandling = DefaultValueHandling.Ignore; string json = JsonConvert.SerializeObject(jack,jSetting); Console.WriteLine(json);
結果:
首先介紹Json.Net序列化的模式:OptOut 和 OptIn.
OptOut | 默認值,類中全部公有成員會被序列化,若是不想被序列化,能夠用特性JsonIgnore |
OptIn | 默認狀況下,全部的成員不會被序列化,類中的成員只有標有特性JsonProperty的纔會被序列化,當類的成員不少,但客戶端僅僅須要一部分數據時,頗有用 |
假如客戶僅僅須要員工的姓名,此時
[JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)] public class Staff { [JsonProperty] public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } public string DepartmentName { get; set; } public Staff Leader { get; set; } }
序列化:
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null }; string json = JsonConvert.SerializeObject(jack);
結果:
若是客戶不想要員工的領導信息
public class Staff { public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } public string DepartmentName { get; set; } [JsonIgnore] public Staff Leader { get; set; } }
序列化:
Staff tom = new Staff { Name = "Tome", Age = 42, Gender = "Male", DepartmentName = "Personnel Department"}; Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = tom }; string json = JsonConvert.SerializeObject(jack); Console.WriteLine(json);
結果:
Json.Net序列化對象時,默認狀況下僅僅序列化公有成員,若是想要非公有成員也被序列化,就要在該成員上加特性"JsonProperty"
JsonConverters會在序列化和反序列化時被用到。JsonConverters容許手動對Json的控制。當Json的結構很複雜和你想改變一個類型怎麼樣被序列化時,這是很是有用的。當一個JsonConverters被添加到JsonSerializer時,它會檢查每一要被序列化和反序列化的值,並返回CanConvert,若是爲True,則JsonConverter讀和寫這個值;須要注意的是,雖然JsonConverter可以使你能夠徹底的控制Json的值,可是不少的Json.Net序列化的特性被限制,像是類型名稱和引用處理。全部的JsonConvert都在命名空間 "Newtonsoft.Json.Converters"下
這是Json.Net中自帶的兩個處理日期的類,默認是IsoDateTimeConverter ,它的格式是"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK".另外一個是JavaScriptTimeConverter,它的格式是 "new Date(ticks)",其實返回的是一個JavaScript的Date對象.
有兩種方式來應用JsonConverter,改變Json序列化和反序列化的行爲.
假設咱們爲員工添加兩個日期類型的成員,出生日期和入職日期
public class Staff { public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } public string DepartmentName { get; set; } public Staff Leader { get; set; } public DateTime BirthDate { get; set; } public DateTime EmploymentDate { get; set; } }
咱們的客戶要求日期類型的成員返回javascript的日期對象
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) }; string json = JsonConvert.SerializeObject(jack,new JavaScriptDateTimeConverter()); Console.WriteLine(json);
結果:
如今咱們的客戶要求出生日期以"ISO"標準日期格式返回,入職日期以Javascript的Date對象格式返回,修改咱們的員工類
public class Staff { public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } public string DepartmentName { get; set; } public Staff Leader { get; set; } [JsonConverter(typeof(IsoDateTimeConverter))] public DateTime BirthDate { get; set; } [JsonConverter(typeof(JavaScriptDateTimeConverter))] public DateTime EmploymentDate { get; set; } }
是的,經過特性"JsonConverter"來實現差別化的
序列化:
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) }; string json = JsonConvert.SerializeObject(jack); Console.WriteLine(json);
結果:
客戶如今提出要求,但願獲得的日期格式是符合中國人習慣的格式.要求返回的格式是"2012年4月20日".挑戰來了,沒有挑戰就沒有進步,我喜歡挑戰.光說是沒有用的!先分析一下怎麼解決這個問題.我考慮了兩種思路.
思路一:
研究了一下上面兩個日期處理類,發現他們都是繼承了基類"DateTimeConverterBase",因此咱們能夠參考"IsoDatetimeConverter"的實現方式,本身新建一個處理日期格式的轉換器類.這種方式的缺點是可能要花大量的時間去研究,比較費時費力.優勢就是能夠對日期格式爲所欲爲的控制.
思路二:
我又研究了一下"IsoDatetimeConverter",發現它的日期格式實際上是因爲內部DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"致使,而它也提供了修改日期樣式的屬性"DateTimeFormat",只要咱們按照這種格式來寫就OK了.
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) }; IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" }; string json = JsonConvert.SerializeObject(jack,dtConverter); Console.WriteLine(json);
結果:
public class Person { public int Id { get; set; } public string Name { get; set; } }
默認序列化的結果爲: {"Id":1,"Name":"楊過"},若是不想用默認的字段名稱,可使用以下方式:
public class Person { [JsonProperty(PropertyName = "PersonId")] public int Id { get; set; } [JsonProperty(PropertyName = "PersonName")] public string Name { get; set; } }
這樣序列化的結果爲:{"PersonId":1,"PersonName":"楊過"}