已移除用于序列化的自定义转换器

ProblemDetailsValidationProblemDetails 以前使用自定义转换器来支持 JSON 序列化,因为 IgnoreNullValues 选项缺少内置支持。 现在,API 支持 System.Text.Json 此选项,我们已从框架中删除了自定义转换器,以支持框架提供的序列化。

由于此更改的结果,ProblemDetailsValidationProblemDetails类型中的属性不再默认使用小写类型名称。 开发人员必须指定一个 JsonNamingPolicy 以获取正确的行为。

已引入的版本

ASP.NET Core 8.0 预览版 2

以前的行为

以前,可以将 JsonStringEnumConverter 添加到序列化选项中作为自定义转换器,并且反序列化会导致 ValidationProblemDetails 返回 400 状态。

string content = "{\"status\":400,\"detail\":\"HTTP egress is not enabled.\"}";
using MemoryStream stream = new();
using StreamWriter writer = new(stream);
writer.Write(content);
writer.Flush();
stream.Position = 0;

JsonSerializerOptions options = new();
options.Converters.Add(new JsonStringEnumConverter());

ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);
Console.WriteLine(details.Status); // 400

新行为

从 .NET 8 开始,相同的代码会导致 nullValidationProblemDetails 状态。

string content = "{\"status\":400,\"detail\":\"HTTP egress is not enabled.\"}";
using MemoryStream stream = new();
using StreamWriter writer = new(stream);
writer.Write(content);
writer.Flush();
stream.Position = 0;

JsonSerializerOptions options = new();
options.Converters.Add(new JsonStringEnumConverter());

ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);
Console.WriteLine(details.Status); // null

破坏性变更的类型

此更改为行为更改

更改原因

现在,JsonSerializerOptions.IgnoreNullValues 已被 System.Text.Json API 支持,我们已删除自定义转换器,转而使用框架提供的序列化。

JsonSerializerOptions 提供正确的详细信息。

JsonSerializerOptions options = new()
{
   PropertyNameCaseInsensitive = true
};
ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);

受影响的 API