Custom converters for serialization removed
ProblemDetails and ValidationProblemDetails previously used custom converters to support JSON serialization due to a lack of built-in support for the IgnoreNullValues
option. Now that this option is supported by the System.Text.Json APIs, we've removed the custom converters from the framework in favor of the serialization provided by the framework.
As a result of this change, the properties in the ProblemDetails and ValidationProblemDetails types no longer assume lowercase type names. Developers must specify a JsonNamingPolicy to get the correct behavior.
Version introduced
ASP.NET Core 8.0 Preview 2
Previous behavior
Previously, you could add JsonStringEnumConverter to the serialization options as a custom converter, and deserialization resulted in a 400 status for 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); // 400
New behavior
Starting in .NET 8, the same code results in a null
status for 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
Type of breaking change
This change is a behavioral change.
Reason for change
Now that JsonSerializerOptions.IgnoreNullValues is supported by the System.Text.Json
APIs, we've removed the custom converters in favor of the serialization provided by the framework.
Recommended action
Provide a JsonSerializerOptions
with the correct details.
JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true
};
ValidationProblemDetails? details = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(stream, options);