次の方法で共有


シリアル化用のカスタム コンバーターが削除されました

IgnoreNullValues の組み込みサポートがないため、以前は、ProblemDetailsValidationProblemDetails には、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 以降では、同じコードが ValidationProblemDetailsnull の状態になります。

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.IgnoreNullValuesSystem.Text.Json API によってサポートされるようになったため、フレームワークに用意されているシリアル化を優先して、カスタム コンバーターを削除しました。

正しい詳細を JsonSerializerOptions に指定します。

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

影響を受ける API