124

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?

4
  • If you don't use AddMvc, what do you use? Are you using e.g. AddControllers or are you just not using MVC at all? Commented Oct 15, 2019 at 10:09
  • @KirkLarkin i use default way of building asp.net core 3 app - app.UseEndpoints(endpoints => { endpoints.MapControllers() }) and services.AddControllers(); Commented Oct 15, 2019 at 10:10
  • Alright, so I guess you're using AddControllers in ConfigureServices, right? Commented Oct 15, 2019 at 10:10
  • @KirkLarkin, yeah, right Commented Oct 15, 2019 at 10:11

6 Answers 6

113

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

Sign up to request clarification or add additional context in comments.

3 Comments

Adding "options.JsonSerializerOptions.IgnoreNullValues = true;" had no effect
To others who hit this page looking for Enum conversion: [JsonConverter(typeof(JsonStringEnumConverter))] public enum SomeEnum
For ASP.NET Core 3.1 (May/2021), we can specify the following to ask the JSON serializer not not serialize null values via the startup.cs file: services.AddControllers() .AddJsonOptions(options => options.JsonSerializerOptions.IgnoreNullValues = true);
76

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

Hi, this sets settings on Json.NET level, how can it be done on ASP.NET level?
It configures the settings on ASP.NET level, meaning default ModelBinding now happens using NewtonsoftJson serializer.
Thank you, Option A worked for me. Upgraded from 2.2 to 3.1 and my endpoint broke because System.Text.Json doesn't handle polymorphism or enums properly. Nice easy way to change the default serializer.
Example for ignroing null values and converting enums to strings: services.AddControllersWithViews().AddNewtonsoftJson(o => { o.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; o.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });
Not sure I'd do this on a new project, but moving legacy code to a new version... +1 for the AddNewtonsoftJson() and the link to the docs.
48

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

Thank you @OSP, but what do you exactly mean "obviously not very good"?
11

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

1. Not so newly 2.Can you please explain claim "Newtonsoft no longer works very well in .Net Core"? 3. what is "configirationSetting method" ?
Hello @GuruStron, 1) it is newly, beacuse it is net core 3.1 libary supported. (devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis) 2) (learn.microsoft.com/en-us/dotnet/standard/serialization/… ) 3) Microsoft is now using new nuget packages from its own freamwork in all software. For this reason, it withdraws support from many of them and directs them to their own packages. Newtonsoft.Json provides support, but now Microsoft wants its own package for Core.
1) Article you've linked in this point is around 1.5 years old 2) this one is about HOW to migrate and does not explain claim in question =)) 3) this point does not answer question "what is "configirationSetting method"" =)
Even in 2022 System.Text.Json is missing core flexibility features that make is a far from ideal candidate for JSON serialization. JSON is designed to be greedy in operation, System.Text.Json continually fails to match that requirement.
I also added "options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;" for similar behavior to .NET framework.
|
5

In .net6 add this code after .AddControllers() in program.cs file:

builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

3 Comments

Question is about net 3.1
My app has the old WebHost.CreateDefaultBuilder(args) left, which does not have .Services. How do I set the JsonOptions there?
Add it after AddControllers() methos in Startup.cs file.
3

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;
           });
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.