Udostępnij za pośrednictwem


Niestandardowe konwertery do serializacji usunięte

ProblemDetails i ValidationProblemDetails wcześniej używane konwertery niestandardowe do obsługi serializacji JSON z powodu braku wbudowanej obsługi IgnoreNullValues opcji. Teraz, gdy ta opcja jest obsługiwana przez System.Text.Json interfejsy API, usunęliśmy niestandardowe konwertery ze struktury na rzecz serializacji dostarczonej przez platformę.

W wyniku tej zmiany właściwości w typach ProblemDetails i ValidationProblemDetails nie zakładają już nazw typów małych liter. Deweloperzy muszą określić element , JsonNamingPolicy aby uzyskać prawidłowe zachowanie.

Wprowadzona wersja

ASP.NET Core 8.0 (wersja zapoznawcza 2)

Poprzednie zachowanie

Wcześniej można było dodać JsonStringEnumConverter do opcji serializacji jako konwerter niestandardowy, a deserializacja spowodowała 400 stanu dla elementu 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

Nowe zachowanie

Począwszy od platformy .NET 8, ten sam kod powoduje null wyświetlenie stanu .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

Typ zmiany powodującej niezgodność

Ta zmiana jest zmianą behawioralną.

Przyczyna wprowadzenia zmiany

Teraz, gdy JsonSerializerOptions.IgnoreNullValues interfejsy API są obsługiwane System.Text.Json , usunęliśmy niestandardowe konwertery na rzecz serializacji dostarczonej przez platformę.

JsonSerializerOptions Podaj odpowiednie szczegóły.

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

Dotyczy interfejsów API