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

2020年1月8日18:50:59.NET Core 3.1中的Json互操作最全解读-收藏级已关闭评论 69 浏览 未收录

前言

很高兴,.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等等。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
武穆逸仙