从 .NET 5 开始,ASP.NET Core 应用使用指定的 JsonSerializerDefaults.Web默认反序列化选项。 选项集 Web 包括将 NumberHandling 设置为 JsonNumberHandling.AllowReadingFromString。 此更改意味着,ASP.NET Core 应用将成功反序列化表示为 JSON 字符串的数字,而不是引发异常。
更改描述
在 .NET Core 3.0 - 3.1 中,如果 JsonSerializer 在 JSON 有效负载中遇到带引号的数字,则在反序列化过程中将引发 JsonException。 带引号的数字用于在对象图中与数字属性进行映射关联。 在 .NET Core 3.0 - 3.1 中,数字仅从 JsonTokenType.Number 令牌中读取。
从 .NET 5 开始,默认情况下,JSON 有效负载中的带引号的数字被视为有效,适用于 ASP.NET Core 应用。 不会在反序列化带引号的数字期间引发异常。
小窍门
- 默认的、独立的 JsonSerializer 或 JsonSerializerOptions 没有行为更改。
- 从技术上来说,这不是一项重大更改,因为它使方案更具宽松性而不是限制性(也就是说,它成功地从 JSON 字符串强制生成数字,而不是引发异常)。 但是,由于这是影响许多 ASP.NET 核心应用的重大行为更改,因此此处对此进行了介绍。
- 这些HttpClientJsonExtensions.GetFromJsonAsync和HttpContentJsonExtensions.ReadFromJsonAsync扩展方法也使用Web的序列化选项集。
已引入的版本
5.0
更改原因
多个用户请求在JsonSerializer中增加一个选项,以便更灵活地处理数字。 此反馈表明许多 JSON 生成者(例如,网络服务)产生带引号的数字。 通过允许读取带引号的数字(反序列化),默认情况下,.NET 应用可以在 Web 上下文中成功分析这些有效负载。 配置通过公开 JsonSerializerDefaults.Web ,以便可以在不同的应用程序层(例如客户端、服务器和共享)中指定相同的选项。
建议的措施
例如,如果此更改是破坏性的,如果依赖于严格的验证编号处理,则可以重新启用以前的行为。 将 JsonSerializerOptions.NumberHandling 选项设置为 JsonNumberHandling.Strict.
对于 ASP.NET Core MVC 和 Web API 应用,可以使用以下代码配置选项 Startup
:
services.AddControllers()
.AddJsonOptions(options => options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.Strict);