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

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 以降では、同じコードがnullValidationProblemDetails状態になります。

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