Partager via


Suppression des convertisseurs personnalisés pour la sérialisation

ProblemDetails et ValidationProblemDetails utilisaient précédemment des convertisseurs personnalisés pour gérer la sérialisation JSON en raison de l’absence de prise en charge intégrée de l’option IgnoreNullValues. Maintenant que cette option est acceptée par les API System.Text.Json, les convertisseurs personnalisés ont été supprimés de l’infrastructure au profit de la sérialisation fournie par l’infrastructure.

Du fait de cette modification, les propriétés des types ProblemDetails et ValidationProblemDetails ne supposent plus de noms de type minuscules. Les développeurs doivent spécifier JsonNamingPolicy pour parvenir à un comportement adéquat.

Version introduite

ASP.NET Core 8.0 Preview 2

Comportement précédent

Il était auparavant possible d’ajouter JsonStringEnumConverter aux options de sérialisation en tant que convertisseur personnalisé. La désérialisation entraînait un statut de 400 pour 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

Nouveau comportement

À compter de .NET 8, le même code génère un état null pour 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

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Maintenant que JsonSerializerOptions.IgnoreNullValues est accepté par les API System.Text.Json, les convertisseurs personnalisés ont été supprimés au profit de la sérialisation fournie par l’infrastructure.

Fournissez JsonSerializerOptions avec les informations appropriées.

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

API affectées