シリアル化用のカスタム コンバーターが削除されました
IgnoreNullValues
の組み込みサポートがないため、以前は、ProblemDetails と ValidationProblemDetails には、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 以降では、同じコードが ValidationProblemDetails で null
の状態になります。
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 が System.Text.Json
API によってサポートされるようになったため、フレームワークに用意されているシリアル化を優先して、カスタム コンバーターを削除しました。
推奨アクション
正しい詳細を JsonSerializerOptions
に指定します。
JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true
};
ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);
影響を受ける API
.NET