Partilhar via


Conversores personalizados para serialização removidos

ProblemDetails e ValidationProblemDetails anteriormente usaram conversores personalizados para garantir a serialização JSON devido à falta de suporte nativo para a opção IgnoreNullValues. Agora que essa opção é suportada System.Text.Json pelas APIs, removemos os conversores personalizados da estrutura em favor da serialização fornecida pela estrutura.

Como resultado desta alteração, as propriedades nos tipos ProblemDetails e ValidationProblemDetails deixam de assumir nomes de tipo em minúsculas. Os desenvolvedores devem especificar a JsonNamingPolicy para obter o comportamento correto.

Versão introduzida

ASP.NET Core 8.0 Preview 2

Comportamento anterior

Anteriormente, você podia adicionar JsonStringEnumConverter às opções de serialização como um conversor personalizado, e a desserialização resultava em um status 400 para ValidationProblemDetails.

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

Novo comportamento

A partir do .NET 8, o mesmo código resulta em um null status para ValidationProblemDetails.

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

Tipo de mudança disruptiva

Esta alteração é de natureza comportamental .

Motivo da mudança

Agora que JsonSerializerOptions.IgnoreNullValues é suportado por System.Text.Json pelas APIs, removemos os conversores personalizados em favor da serialização fornecida pela estrutura.

Forneça um JsonSerializerOptions com os detalhes corretos.

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

APIs afetadas