已移除序列化的自訂轉換器
由於缺乏 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
中斷性變更的類型
此變更為行為變更。
變更原因
既然 System.Text.Json
API 已支援 JsonSerializerOptions.IgnoreNullValues,我們已移除自訂轉換器。改為使用架構提供的序列化。
建議的動作
提供具有正確詳細資料的 JsonSerializerOptions
。
JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true
};
ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);