json serializer settings for legacy asp.net core applications were set by adding AddMvc().AddJsonOptions(), but I don't use AddMvc() in asp.net core 3. So how can I set global json serialization settings?
6 Answers
AddMvc returns an IMvcBuilder implementation, which has a corresponding AddJsonOptions extension method. The new-style methods AddControllers, AddControllersWithViews, and AddRazorPages also return an IMvcBuilder implementation. Chain with these in the same way you would chain with AddMvc:
services.AddControllers()
.AddJsonOptions(options =>
{
// ...
});
Note that options here is no longer for Json.NET, but for the newer System.Text.Json APIs. If you still want to use Json.NET, see tymtam's answer
3 Comments
Option A. AddControllers
This is still MVC, and requires Microsoft.AspNetCore.Mvc.NewtonsoftJson nuget package, but you said you use AddControllers.
From Add Newtonsoft.Json-based JSON format support
services.AddControllers().AddNewtonsoftJson(options =>
{
// Use the default property (Pascal) casing
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
// Configure a custom converter
options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});
Option B. DefaultSettings
JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)
JsonConvert.DefaultSettings Property
Gets or sets a function that creates default JsonSerializerSettings. Default settings are automatically used by serialization methods on JsonConvert, and ToObject () and FromObject(Object) on JToken. To serialize without using any default settings create a JsonSerializer with Create().
5 Comments
System.Text.Json doesn't handle polymorphism or enums properly. Nice easy way to change the default serializer.services.AddControllersWithViews().AddNewtonsoftJson(o => { o.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; o.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });AddNewtonsoftJson() and the link to the docs.Adding Newtonsoft is not necessary, quite a problems with adding Newtonsoft compatibility packages on .Net Core 3.0 project.
See also https://github.com/aspnet/AspNetCore/issues/13564
Of course, one would celebrate property naming PascalCase, NA at the moment...
So null for PropertyNamingPolicy means PascalCase, which is obviously not very good.
// Pascal casing
services.AddControllersWithViews().
AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
1 Comment
You can try System.Text.Json, the newly released Json nuget package converter.
Startup.cs as below
You can write this code inside the configirationSetting method.
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
options.JsonSerializerOptions.PropertyNamingPolicy = null;
options.JsonSerializerOptions.Converters.Add (new JsonStringEnumConverter ());
});
6 Comments
In .net6 add this code after .AddControllers() in program.cs file:
builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
3 Comments
WebHost.CreateDefaultBuilder(args) left, which does not have .Services. How do I set the JsonOptions there?1.install NuGet : Microsoft.AspNetCore.Mvc.NewtonsoftJson or
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.2" />
</ItemGroup>
2. Add Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
//JSON Serializer
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
}
AddMvc, what do you use? Are you using e.g.AddControllersor are you just not using MVC at all?app.UseEndpoints(endpoints => { endpoints.MapControllers() })andservices.AddControllers();AddControllersinConfigureServices, right?