System.Text.Json更进一步。(.NET 5.0) 原题:What‘s next for System.Text.Json?

原文地址: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.JsonNewtonsoft.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。以下为提供的简便方法:

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 序列化和反序列

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值