一、JSON介紹
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,易於閱讀和編寫,同時也易於解析和生成。它基於JavaScript語言的子集,但是它是一種獨立於編程語言的數據格式。
JSON數據可以表示為一個文本字元串,它使用一些簡單的規則來描述數據的結構。一個JSON值可以是一個對象、一個數組、一個數字、一個字元串、一個布爾值,或者一個null。對象由一對花括弧{}包裹,數組由一對中括弧[]包裹。
二、Newtonsoft.Json介紹
Newtonsoft.Json是一款.NET平台下的JSON處理庫,支持.NET Framework、.NET Core以及Mono平台,提供了一個快速簡便的方式去序列化和反序列化.NET對象。
Newtonsoft.Json支持基本類型或對象轉化為JSON表示,並且可以從JSON表示中還原回對象,它的反序列化功能非常強大。
三、反序列化數據類型
Newtonsoft.Json支持多種數據類型的反序列化,包括簡單類型(如字元串、數字、布爾等)、自定義類型、集合類型等。
四、JSON到對象反序列化示例
//json字元串示例 string json = "{ \"name\": \"Bruce\", \"age\": 38 }"; //定義一個Person類,用於反序列化 public class Person { public string name { get; set; } public int age { get; set; } } //反序列化為Person對象 Person person = JsonConvert.DeserializeObject<Person>(json);
在上面的示例中,首先定義了一個JSON字元串,然後定義了一個Person類,即我們要反序列化為的對象,最後調用Newtonsoft.Json的DeserializeObject方法進行反序列化,其中泛型參數為要轉換的目標類型。
五、多層嵌套JSON反序列化
在實際應用中,我們經常會遇到多層嵌套的JSON數據,例如下面的JSON字元串:
{ "name": "Bruce", "age": 38, "address": { "street": "123 Main Street", "city": "New York" } }
要反序列化該JSON數據,只需在Person類中添加一個Address屬性,並定義一個嵌套的Address類:
public class Person { public string name { get; set; } public int age { get; set; } public Address address { get; set; } } public class Address { public string street { get; set; } public string city { get; set; } }
修改後的Person類中包含了一個Address類型的屬性,然後再次調用DeserializeObject方法,就可以實現多層JSON的反序列化。
六、JSON數組反序列化
JSON數組是指由一組元素組成的集合,例如下面的JSON字元串:
[ { "name": "Bruce", "age": 38 }, { "name": "Tony", "age": 40 }, { "name": "Steve", "age": 100 } ]
要反序列化上述JSON數組,只需將其定義為一個Person對象的集合即可:
//json字元串示例 string json = "......"; //定義Person類和一個集合用於保存反序列化後的對象 public class Person { public string name { get; set; } public int age { get; set; } } List<Person> people = JsonConvert.DeserializeObject<List<Person>>(json);
在上面的示例中,使用了List<Person>類型來保存反序列化後的Person對象集合,同樣調用DeserializeObject方法即可完成JSON數組的反序列化。
七、使用JsonProperty特性指定JSON屬性名
在默認情況下,Newtonsoft.Json會將對象屬性名和對應的JSON屬性名一一匹配。但是,當JSON屬性名與對象屬性名不匹配時,我們可以使用JsonProperty特性來指定JSON屬性名稱。
public class Person { [JsonProperty("Name")] public string name { get; set; } [JsonProperty("Age")] public int age { get; set; } }
在上面的示例中,使用了JsonProperty特性來指定了JSON屬性名,即將Person類的name屬性對應到JSON的Name屬性,將age屬性對應到JSON的Age屬性。
八、使用DefaultValueHandling特性設置默認值
當JSON數據中缺少一些屬性時,反序列化的結果中對應的屬性值為null。如果我們需要設置默認值,可以使用DefaultValueHandling特性來指定默認值。
public class Person { public string name { get; set; } [DefaultValue(25)] public int age { get; set; } }
在上面的示例中,使用了DefaultValueHandling特性來指定了age屬性的默認值為25,即JSON數據中如果缺少age屬性,則age屬性的值默認為25。
九、使用JsonConverter自定義反序列化
有些時候,我們需要對某些特殊的JSON格式進行自定義的反序列化處理。例如,某些JSON格式中的日期類型可能並不是我們期望的格式,此時可以自定義JsonConverter來進行反序列化。
//自定義一個DateTimeConverter用於反序列化 public class DateTimeConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(DateTime); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { DateTime result; if (DateTime.TryParse(reader.Value.ToString(), out result)) { return result; } else { return new DateTime(); } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss")); } } //定義一個包含日期屬性的Person類 public class Person { public string name { get; set; } [JsonConverter(typeof(DateTimeConverter))] //使用上面定義的DateTimeConverter public DateTime birthday { get; set; } } //json字元串示例 string json = "{ \"name\": \"Bruce\", \"birthday\": \"2021-12-12 12:12:12\" }"; //反序列化為Person對象 Person person = JsonConvert.DeserializeObject<Person>(json);
在上面的示例中,我們自定義了一個DateTimeConverter來處理日期格式,其中CanConvert方法指定了要處理的數據類型,ReadJson方法實現了反序列化邏輯,WriteJson方法實現了序列化邏輯。然後在類的birthday屬性上使用了JsonConverter特性來指定使用我們自定義的DateTimeConverter進行反序列化。
原創文章,作者:WBFED,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/335082.html