Compartir vía


Eliminación de convertidores personalizados para serialización

ProblemDetails y ValidationProblemDetails usaron previamente convertidores personalizados para admitir la serialización JSON debido a la falta de compatibilidad integrada con la IgnoreNullValues opción . Ahora que esta opción es compatible con las System.Text.Json API, 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 ProblemDetails tipos y ValidationProblemDetails ya no asumen nombres de tipo en minúsculas. Los desarrolladores deben especificar un JsonNamingPolicy para obtener el comportamiento correcto.

Versión introducida

ASP.NET Core 8.0 Preview 2

Comportamiento anterior

Anteriormente, podría agregar JsonStringEnumConverter a las opciones de serialización como un convertidor personalizado y la deserialización dio como resultado 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

Nuevo comportamiento

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

Este es un cambio de comportamiento.

Motivo del cambio

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

Proporcione un JsonSerializerOptions con los detalles correctos.

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

Las APIs afectadas