一、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进行反序列化。