原文地址:https://devblogs.microsoft.com/dotnet/whats-next-for-system-text-json/
最近实习有用到json的序列化和反序列化,在查找资料的过程中发现了这篇文章,这篇文章以库作者的视角介绍System.Text.Json
,感觉视角一下拔高了许多。于是在空闲之余翻译了此文。
路漫漫其修远兮,吾将上下而求索。
第一次尝试翻译这么长的博客,有误之处敬请提出,以免由于我的失误免误导他人。
以下是正文:
刚刚发布的.NET 5.0带来了许多新特性(new features)和一系列性能提升。System.Text.Json
也不例外。我们改进了它的性能、可靠性,同时使其更容易被那些熟悉Newtonsoft.Json
的开发人员使用。在这篇文章中,我将会讨论System.Text.Json
取得的进展和未来的发展方向。
获取System.Text.Json
库
- 如果你的项目目标框架为.NET 5,.NET 5提供了开箱即用的
System.Text.Json
库,无需其它先决条件。点此下载.NET 5。 - 如果你的项目目标框架为.NET Core 3.x或者.NET Framework,或者你想要构建一个.NET Standard兼容库,请安装最新的System.Text.Json NuGet包。
- 如果你正在进行一个新的ASP.NET Core项目或者正在将一个已经存在的ASP.NET Core 2.2项目从2.2升级到3.0或5.0,
System.Text.Json
将会是新项目和升级项目默认使用的序列化库。
什么是System.Text.Json
?
System.Text.Json
是.NET内置的用于.NET对象类型和JSON字符串相互转换的JSON(JavaScript Object Notation, JS 对象简谱)序列化库,并且支持UTF-8编码。它在.NET Core 3.0被添加进来。在这个库中,使用最为频繁的类型当属JsonSerializer
,此类型提供了最直接的(highest level of functionality)处理JSON数据的功能。这里有一个简单的示例向你展示如何使用此库序列化和反序列化JSON数据:
using System;
using System.Text.Json;
MyType obj = new() { Message = "Hello World!" };
string json = JsonSerializer.Serialize(obj);
Console.WriteLine(json); // {"Message":"Hello World!"}
MyType anotherObject = JsonSerializer.Deserialize<MyType>("{"Message":"Hello Again."}");
Console.WriteLine(anotherObject.Message); // "Hello Again."
public class MyType
{
public string Message { get; set; }
}
为什么使用System.Text.Json
?回顾.NET Core 3.x以寻找答案。
处理JSON数据已经成为现代.NET程序中必不可少的一环,在许多情况下,JSON的使用甚至已经超过了XML。然而,.NET框架中并没有一个很好处理JSON数据的内置方法。所以,此前用户只能依赖Newtonsoft.Json
,Newtonsoft.Json
持续为.NET生态提供了很棒的服务,显然,用户将从集成在框架中的现代JSON库获益。因此,我们基于以下几点考虑构建了一个新的JSON库:
- **提供一批高性能的JSON处理API。**我们需要一个针对性能进行深度调优的JSON API集,利用诸如
Span<T>
的框架新特性,获得直接处理UTF-8编码(无需将其转码至UTF-16字符串)的能力。性能优化对于ASP.NET Core至关重要,因为吞吐量是ASP.NET Core的关键需求。我们曾考虑过促成Newtonsoft.Json
的升级,但我们认为要做到既能延续Newtonsoft.Json
用户的使用体验也不牺牲我们本可以达到的性能是不可能的。 - **从ASP.NET Core中移除
Newtonsoft.Json
依赖。在.NET Core 3.x之前,ASP.NET Core都有着对Newtonsoft.Json
的依赖。**虽然.NET Core 3.x之前提供了ASP.NET Core和Newtonsoft.Json
之间紧密的连接,这也意味着Newtonsoft.Json
的版本由基础平台决定。然而,Newtonsoft.Json
有着频繁的更新,应用开发者们经常需要使用一个特定的版本。因此,我们想要从ASP.NET Core 3.0中移除对Newtonsoft.Json
的依赖,以便开发者们能够自由选择他们想要使用的版本而不用担心因为Newtonsoft.Json
版本和基础平台关联导致的可能发生的意外。
考虑到Newtonsoft.Json
在.NET生态中无所不在,我们不希望从ASP.NET Core中移除Newtonsoft.Json
依赖后没有一个简单的方法去重新获取一个作为序列化机制的Newtonsoft.Json
。以下为提供的简便方法:
- 下载Microsoft.AspNetCore.Mvc.Newtonsoft.Json NuGet包。
- 更新
Startup.ConfigureServices()
以调用AddNewtonsoftJson()
。
services.AddMvc().AddNewtonsoftJson();
有关更多信息,见Newtonsoft.Json(Json.NET)support.
.NET Core 3.0中的新内容
在.NET Core 3.0中,我们在System.Text.Json命名空间中提供了以下类型:
- JsonSerializer: 提供将.NET对象序列化成JSON格式和将JSON反序列化成.NET对象的方法。
- JsonDocument: 提供随机访问的能力以检查JSON值的结构内容而不需自动化实例数据值。此类型是不可变的(immutable type)。
- JsonElement: 表示
JsonDocument
中的特定JSON值。 - Utf8JsonWriter: 提供高性能API,用于对UTF-8编码的JSON文本的仅前向,非缓存写入。
- Utf8JsonReader: 提供高性能API,用于对UTF-8编码的JSON文本进行仅转发的逐令牌处理。
在System.Text.Json.Serialization命名空间中,我们提供了一些用于高级场景和用户定制的属性和API,这些属性和API特定于JsonSerializer
的序列化和反序列化。其中使用最多的为JsonConverter<T>
类型,此类型允许用户控制序列化和反序列化特定的类型、属性、字段。
JsonSerializer
提供了最直接的处理JSON数据的功能。由于实现一个用于持久性数据格式(a persistent data format)和.NET对象类型之间转换的序列化器需要极其宽阔广泛的功能,与JSON相关的其它类型相比,JsonSerializer
正在进行更多的开发并且受到更多的社区反馈。因此,本文将主要介绍JsonSerializer
的功能。
在3.0版本,我们提供了具有以下功能的JsonSerializer
:
- 支持对简单传统CLR对象(POCO)、基元类型、集合进行序列化和反序列化;
- 内置的异步序列化和反序列化;
- 原生处理UTF-8数据;
- 反序列化可选是否区分大小写;
- 使用
JsonNamingPolicy.CamelCase
的驼峰命名策略; - 使用
JsonNamingPolicy
指定自定义命名策略; - 转义的JSON数据反序列化;
- 序列化时可选的最小字符转义;
- 序列化时忽略空值;
- 反序列化时忽略注释;
- 允许(JSON)尾随逗号;
- 可定制转换器;
- 使用
[JsonExtensionData]
特性指示在反序列化时没有匹配成员的属性存放处(a property overflow bag);(注:当属性的类型为IDictionary<TKey,TValue>
时,没有匹配成员的任何属性都会在反序列化期间添加到该字典中,并在序列化期间中写入) - 使用
[JsonIgnore]
特性忽略特定的属性; - 使用
[JsonProperty]
特性来指定自定义属性名。(注:未使用[JsonProperty]
特性时Json对应的实体类属性名需要与Json对应属性完全一致,使用[JsonProperty]
特性标识PropertyName
后,实体类属性名可自定义)
有关System.Text.Json
提供的功能概述,见.NET 中的 JSON 序列化和反序列