JSON序列化和反序列化最好的C#库——Newtonsoft.Json

一、什么是JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可以将数据进行简单地描述和传输。它以键值对的方式组织数据,常用于前后端数据传输、数据存储和配置文件等场合。JSON的语法和JavaScript中的对象字面量非常类似,但是它是一种独立于编程语言的格式。C#提供了丰富的JSON序列化和反序列化库,其中最著名的是Newtonsoft.Json。

二、Newtonsoft.Json的优点

Newtonsoft.Json是一个功能强大的JSON序列化和反序列化库,它支持.NET Framework、.NET Core和Mono等多个平台,拥有广泛的应用。相较于C#自带的System.Text.Json库,它具有更好的兼容性和灵活性,可以满足各种复杂的JSON数据需求。

Newtonsoft.Json的主要优点包括:

1. 处理复杂数据结构更方便。

与System.Text.Json相比,Newtonsoft.Json更容易处理嵌套复杂的JSON数据结构,例如嵌套数组、嵌套对象等,而且提供了更多的自定义选项,便于根据需求调整序列化和反序列化的行为。

2. 支持自定义序列化规则。

Newtonsoft.Json提供了丰富的自定义序列化和反序列化选项,可以通过自定义JsonConverter来支持不规则的数据结构,如xml、csv等格式的数据。

3. 具有良好的性能和兼容性。

Newtonsoft.Json拥有良好的性能和兼容性,可以处理大量的JSON数据,且在各种平台和框架中都能够正常运行。它在github上的关注度和贡献者数量也很高,社区支持比较完善。

三、Newtonsoft.Json的基本用法

下面演示Newtonsoft.Json的基本用法,包括:对象序列化、对象反序列化、匿名类型序列化、匿名类型反序列化和JSON字符串转换。我们可以通过Nuget安装Newtonsoft.Json包,然后引入Newtonsoft.Json命名空间。

1. 对象序列化

对象序列化指将C#对象转换为JSON字符串,常用于网络传输或文件保存等。Newtonsoft.Json提供了JsonConvert.SerializeObject()方法来进行对象序列化,可以将对象转换为JSON字符串。

using Newtonsoft.Json;

public class Person {
    public string Name;
    public int Age;
}

Person person = new Person { Name = "张三", Age = 20 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 输出:{"Name":"张三","Age":20}

2. 对象反序列化

对象反序列化指将JSON字符串转换为C#对象,常用于接收网络请求或读取文件等。Newtonsoft.Json提供了JsonConvert.DeserializeObject()方法来进行对象反序列化,可以将JSON字符串转换为对象。

string json = '{"Name":"张三","Age":20}';
Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.Name); // 输出:张三
Console.WriteLine(person.Age); // 输出:20

3. 匿名类型序列化

匿名类型指在声明时不指定类型名称的对象,常用于简单的数据快速传递。Newtonsoft.Json可以直接对匿名类型进行序列化,不需要声明额外的类型。

var person = new { Name = "张三", Age = 20 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 输出:{"Name":"张三","Age":20}

4. 匿名类型反序列化

同样地,Newtonsoft.Json也可以对匿名类型进行反序列化。

string json = '{"Name":"张三","Age":20}';
var person = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(person.Name); // 输出:张三
Console.WriteLine(person.Age); // 输出:20

5. JSON字符串转换

Newtonsoft.Json提供了JObject和JArray两种类型来方便地处理JSON字符串。

string json = '{"Name":"张三","Age":20}';
JObject obj = JObject.Parse(json);
string name = obj["Name"].ToString();
int age = (int)obj["Age"];
Console.WriteLine(name); // 输出:张三
Console.WriteLine(age); // 输出:20

四、Newtonsoft.Json高级用法

1. 序列化属性过滤

有时候,需要有选择地对对象进行序列化,只序列化其中的一些属性,跳过其他属性。可以使用JsonPropertyAttribute和JsonIgnoreAttribute属性来指定属性的序列化和忽略选项。

public class Person {
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonIgnore]
    public int Age { get; set; }
}

Person person = new Person { Name = "张三", Age = 20 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 输出:{"name":"张三"}

2. 自定义序列化方式

如果需要对特定类型进行自定义的序列化和反序列化操作,可以继承JsonConverter,并重写它的ReadJson和WriteJson方法。下面是一个将枚举值序列化成小写字符串的例子。

class LowercaseEnumConverter : JsonConverter {
    public override bool CanConvert(Type objectType) {
        return objectType.IsEnum;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        writer.WriteValue(value.ToString().ToLowerInvariant());
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        return Enum.Parse(objectType, (string)reader.Value, true);
    }
}

enum Gender { Male, Female };

public class Person {
    public string Name;
    [JsonConverter(typeof(LowercaseEnumConverter))]
    public Gender Gender;
}

Person person = new Person { Name = "张三", Gender = Gender.Male };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 输出:{"Name":"张三","Gender":"male"}

Person person2 = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person2.Gender); // 输出:Gender.Male

3. 非标准JSON序列化

有些特殊的JSON格式不符合标准的JSON规范。例如,如果在属性名中包含了非字母和数字字符,或者在数组中包含了不同类型的元素,标准的JSON库会报错。Newtonsoft.Json提供了一些选项,可以用于处理这些非标准的JSON格式。

string json = '{"field-a": 1, "field-b": "value-b", "field-c": true}';
JObject obj = JObject.Parse(json);
int fieldA = (int)obj["field-a"];
string fieldB = (string)obj["field-b"];
bool fieldC = (bool)obj["field-c"];
Console.WriteLine(fieldA); // 输出:1
Console.WriteLine(fieldB); // 输出:value-b
Console.WriteLine(fieldC); // 输出:True

string json2 = '[1, "value-b", True]';
JArray arr = JArray.Parse(json2);
int elem1 = (int)arr[0];
string elem2 = (string)arr[1];
bool elem3 = (bool)arr[2];
Console.WriteLine(elem1); // 输出:1
Console.WriteLine(elem2); // 输出:value-b
Console.WriteLine(elem3); // 输出:True

小结

Newtonsoft.Json是C#中最好的JSON序列化和反序列化库之一,具有灵活性、兼容性和性能优势。通过本文的介绍,我们了解了Newtonsoft.Json的基本用法和高级用法,可以满足各种复杂的JSON数据需求。在进行C#开发时,选择Newtonsoft.Json可以方便地处理JSON数据,提高效率。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-30 16:09
下一篇 2024-12-30 16:09

相关推荐

  • 金额选择性序列化

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

    编程 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数据并解析相关内容。通过使用Python的第三方库,我们可以轻松地处理JSON数据,包括读取、提取和操作JSON数据。 一、获取JSON数…

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

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

    编程 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

发表回复

登录后才能评论