已删除用于序列化的自定义转换器
由于缺少对 IgnoreNullValues
选项的内置支持,ProblemDetails 和 ValidationProblemDetails 之前使用自定义转换器来支持 JSON 序列化。 现在,System.Text.Json API 支持此选项,我们已从框架中删除自定义转换器,以支持框架提供的序列化。
由于此更改,ProblemDetails 和 ValidationProblemDetails 类型中的属性不再采用小写类型名称。 开发人员必须指定 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 开始,相同的代码会导致 ValidationProblemDetails 的 null
状态。
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
中断性变更的类型
此更改为行为更改。
更改原因
现在,System.Text.Json
API 支持 JsonSerializerOptions.IgnoreNullValues,我们删除了自定义转换器,以支持框架提供的序列化。
建议的操作
向 JsonSerializerOptions
提供正确的详细信息。
JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true
};
ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);