Compartir vía


Eliminación de convertidores personalizados para serialización

ProblemDetails y ValidationProblemDetails anteriormente usaban convertidores personalizados para admitir la serialización JSON debido a la falta de compatibilidad integrada con la opción IgnoreNullValues. Ahora que esta opción es compatible con las API System.Text.Json, hemos quitado los convertidores personalizados del marco en favor de la serialización proporcionada por el marco.

Como resultado de este cambio, las propiedades de los tipos ProblemDetails y ValidationProblemDetails ya no asumen nombres de tipo en minúsculas. Los desarrolladores deben especificar un elemento JsonNamingPolicy para obtener el comportamiento correcto.

Versión introducida

ASP.NET Core 8.0 (versión preliminar 2)

Comportamiento anterior

Anteriormente, podía agregar JsonStringEnumConverter a las opciones de serialización como un convertidor personalizado, y la deserialización resultaba en un estado 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

Comportamiento nuevo

A partir de .NET 8, el mismo código da como resultado un estado null 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 cambio importante

Este es un cambio de comportamiento.

Motivo del cambio

Ahora que JsonSerializerOptions.IgnoreNullValues es compatible con las API System.Text.Json, hemos quitado los convertidores personalizados en favor de la serialización proporcionada por el marco.

Proporcione JsonSerializerOptions con los detalles correctos.

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

API afectadas