microsoft / dotnet

This repo is the official home of .NET on GitHub. It's a great starting point to find many .NET OSS projects from Microsoft and the community, including many that are part of the .NET Foundation.
https://devblogs.microsoft.com/dotnet/
MIT License
14.25k stars 2.2k forks source link

How to make global settings with JsonSerializerOptions whit .net 8.0 #1417

Open zdw2018 opened 8 months ago

zdw2018 commented 8 months ago

1

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) };

JsonSerializerOptions.Default = options; image

2

image This configuration doesn't work

3

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};

System.Text.Json.JsonSerializer.Serialize(object, option); It has to be set up this way for it to work, it's a bit too much of a pain to pass a configuration item each time you serialize it

alenroki commented 2 months ago

I would also like to know how to configure this globally. In Azure Functions before .NET 8 this used to work just fine:

    // Setting global System.Text.Json.JsonSerializerOptions
    services.Configure<JsonSerializerOptions>(options =>
    {
        options.PropertyNameCaseInsensitive = true;
        options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault;  // Property is ignored if its value is null. This is applied only to reference-type properties and fields.
    });
mswehli commented 1 month ago

After playing around a little i found it. .net 8 seems to have changed where you configure json options from. In addition to the .AddControllers().AddJsonOptions method which is still required for parsing request enums from strings, you should now use the ConfigureHttpJsonOptions method for parsing response enums to strings.

e.g.

builder.Services.ConfigureHttpJsonOptions( opt =>{
    opt.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
});