您的位置:

探究newtonsoft.json反序列化

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