探究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进行反序列化。

原创文章,作者:WBFED,如若转载,请注明出处:https://www.506064.com/n/335082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
WBFEDWBFED
上一篇 2025-02-05 13:06
下一篇 2025-02-05 13:06

相关推荐

  • 金额选择性序列化

    本文将从多个方面对金额选择性序列化进行详细阐述,包括其定义、使用场景、实现方法等。 一、定义 金额选择性序列化指根据传入的金额值,选择是否进行序列化,以达到减少数据传输的目的。在实…

    编程 2025-04-29
  • JSON的MD5

    在Web开发过程中,JSON(JavaScript Object Notation)是最常用的数据格式之一。MD5(Message-Digest Algorithm 5)是一种常用…

    编程 2025-04-29
  • 使用Java将JSON写入HDFS

    本篇文章将从以下几个方面详细阐述Java将JSON写入HDFS的方法: 一、HDFS简介 首先,先来了解一下Hadoop分布式文件系统(HDFS)。HDFS是一个可扩展性高的分布式…

    编程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文将从多个方面深入探讨Java反序列化漏洞,对于笔者所总结的经验和教训,以及掌握Java反序列化的设计模式、最佳实践和防范措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    编程 2025-04-28
  • 如何使用Newtonsoft datatable转Json

    Newtonsoft DataTable 是一个基于.NET的JSON框架,也是一个用于序列化和反序列化JSON的强大工具。 在本文中,我们将学习如何使用Newtonsoft Da…

    编程 2025-04-28
  • JPRC – 轻松创建可读性强的 JSON API

    本文将介绍一个全新的 JSON API 框架 JPRC,通过该框架,您可以轻松创建可读性强的 JSON API,提高您的项目开发效率和代码可维护性。接下来将从以下几个方面对 JPR…

    编程 2025-04-27
  • Python存为JSON的方法及实例

    本文将从以下多个方面对Python存为JSON做详细的阐述。 一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅…

    编程 2025-04-27
  • 使用Python获取JSON并解析

    本文将介绍如何使用Python获取JSON数据并解析相关内容。通过使用Python的第三方库,我们可以轻松地处理JSON数据,包括读取、提取和操作JSON数据。 一、获取JSON数…

    编程 2025-04-27
  • 使用Spread 8展示JSON数据

    使用Spread 8可以方便地展示JSON数据,本文将详细介绍如何利用Spread 8展示JSON数据。 一、Spread 8简介 Spread 8是一款强大的电子表格软件,可以方…

    编程 2025-04-27
  • 如何在json转实体类时忽略大小写

    本文将从以下几个方面介绍如何在json转实体类时忽略大小写。 一、使用Gson库实现json转实体类忽略大小写 Gson是Google提供的Java JSON操作库,它提供了简单易…

    编程 2025-04-27

发表回复

登录后才能评论