ProblemDetails
ValidationProblemDetails オプションIgnoreNullValues組み込みのサポートがないため、以前はカスタム コンバーターを使用して JSON シリアル化をサポートしました。
System.Text.Json API でこのオプションがサポートされたので、フレームワークによって提供されるシリアル化を優先して、フレームワークからカスタム コンバーターを削除しました。
この変更の結果、 ProblemDetails 型と ValidationProblemDetails 型のプロパティでは、小文字の型名が使用されなくなりました。 開発者は、正しい動作を得るために JsonNamingPolicy を指定する必要があります。
導入されたバージョン
ASP.NET Core 8.0 Preview 2
以前の動作
以前は、カスタム コンバーターとしてシリアル化オプションに JsonStringEnumConverter を追加できました。逆シリアル化の結果、 ValidationProblemDetailsの状態は 400 でした。
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
新しい動作
.NET 8 以降では、同じコードがnullの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
破壊的変更の種類
この変更は 動作の変更です。
変更の理由
JsonSerializerOptions.IgnoreNullValues API でSystem.Text.Jsonがサポートされたので、フレームワークによって提供されるシリアル化を優先してカスタム コンバーターを削除しました。
推奨されるアクション
正しい詳細を JsonSerializerOptions に指定します。
JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true
};
ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);
影響を受ける API
ASP.NET Core