.NET Core 3.1中的Json互操作最全解读-收藏级

前言

很高兴,.NETCore 终于来到了 3.1LTS 版本,并且将支持 3 年,我们也准备让部分业务迁移到 3.1 上面,不过很快我们就遇到了新的问题,就是对于 Json 序列化的选择;我本着清真的原则,既然选择迁移到 3.1,一切都应该用官方标准或者建议方案。 

所以我们信心满满的选择了 System.Text.Json。 

本文将会全面介绍 System.Text.Json 和 Newtonsoft.Json 的相同和异同之处,方便需要的同学做迁移使用,对未来,我们保持期待。

文档比较

 

几个重要的对象

 

在 System.Text.Json 中,有几个重量级的对象,所有的 JSON 互操作,都是围绕这几个对象进行,只要理解了他们各自的用途用法,就基本上掌握了 JSON 和实体对象的互操作。

JsonDocument

 

提供用于检查 JSON 值的结构内容,而不自动实例化数据值的机制。JsonDocument 有一个属性 RootElement,提供对 JSON 文档根元素的访问,RootElement 是一个 JsonElement对象

JsonElement

 

提供对 JSON 值的访问,在 System.Text.Json 中,大到一个对象、数组,小到一个属性、值,都可以通过 JsonElement 进行互操作

JsonProperty

 

JSON 中最小的单元,提供对属性、值的访问

JsonSerializer

 

提供 JSON 互操作的静态类,提供了一系列 Serializer/Deserialize 的互操作的方法,其中还有一些异步/流式操作方法。

JsonSerializerOptions

 

与上面的 JsonSerializer 配合使用,提供自定义的个性化互操作选项,包括命名、枚举转换、字符转义、注释规则、自定义转换器等等操作选项。

Utf8JsonWriter/Utf8JsonReader

 

这两个对象是整个 System.Text.Json 的核心对象,所有的 JSON 互操作几乎都是通过这两个对象进行,他们提供的高性能的底层读写操作。

初始化一个简单的 JSON 对象

 

在 System.Text.Json 中,并未提供像 JToken 那样非常便捷的创建对象的操作,想要创建一个 JSON 对象,其过程是比较麻烦的,请看下面的代码,进行对比

// Newtonsoft.Json.Linq;
JToken root = new JObject();
root["Name"] = "Ron";
root["Money"] = 4.5;
root["Age"] = 30;
string jsonText = root.ToString();

// System.Text.Json
string json = string.Empty;
using (MemoryStream ms = new MemoryStream())
{
using (Utf8JsonWriter writer = new Utf8JsonWriter(ms))
    {
        writer.WriteStartObject();
        writer.WriteString("Name", "Ron");
        writer.WriteNumber("Money", 4.5);
        writer.WriteNumber("Age", 30);
        writer.WriteEndObject();
        writer.Flush();
    }
    json = Encoding.UTF8.GetString(ms.ToArray());
}

 

System.Text.Json 的操作便利性在这方面目前处于一个比较弱的状态,不过,从这里也可以看出,可能官方并不希望我们去直接操作 JSON 源,而是通过操作实体对象以达到操作 JSON 的目的,也可能对互操作是性能比较自信的表现吧。

封装和加载

 

在对 JSON 文档进行包装的用法

var json = "{"name":"Ron","money":4.5}";
var jDoc = System.Text.Json.JsonDocument.Parse(json);
var jToken = Newtonsoft.Json.Linq.JToken.Parse(json);

我发现 MS 这帮人很喜欢使用 Document 这个词,包括 XmlDocument/XDocument 等等。

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
1 2 3 4
图片正在生成中,请稍后...