Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0?

119,920

Solution 1

As part of ASP.NET Core 3.0, the team moved away from including Json.NET by default. You can read more about that in general in the announcement on breaking changes to Microsoft.AspNetCore.App.

Instead of Json.NET, ASP.NET Core 3.0 and .NET Core 3.0 include a different JSON API that focuses a bit more on performance. You can learn about that more in the announcement about “The future of JSON in .NET Core 3.0”.

The new templates for ASP.NET Core will no longer bundle with Json.NET but you can easily reconfigure the project to use it instead of the new JSON library. This is important for both compatibility with older projects and also because the new library is not supposed to be a full replacement, so you won't see the full feature set there.

In order to reconfigure your ASP.NET Core 3.0 project with Json.NET, you will need to add a NuGet reference to Microsoft.AspNetCore.Mvc.NewtonsoftJson, which is the package that includes all the necessary bits. Then, in the Startup’s ConfigureServices, you will need to configure MVC like this:

services.AddControllers()
    .AddNewtonsoftJson();

This sets up MVC controllers and configures it to use Json.NET instead of that new API. Instead of controllers, you can also use a different MVC overload (e.g. for controllers with views, or Razor pages). That AddNewtonsoftJson method has an overload that allows you to configure the Json.NET options like you were used to with AddJsonOptions in ASP.NET Core 2.x.

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

Solution 2

This worked for me, while using .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

Solution 3

Make sure that you installed the Microsoft.AspNetCore.Mvc.NewtonsoftJson package.

enter image description here

Solution 4

This would help try Installing the Nuget Package

Microsoft.AspNetCore.Mvc.NewtonsoftJson

Solution 5

It's work for me, Install the NewtonsoftJson package from NuGet "dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson --version 3.1.0" version 3.1.0 working for ASP.NET Core 3.0 and use the Following Code-

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
    .AddNewtonsoftJson(opt => {
        opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

Hope it's Working Fine, Thanks.

Share:
119,920

Related videos on Youtube

NeilMacMullen
Author by

NeilMacMullen

Updated on March 17, 2022

Comments

  • NeilMacMullen
    NeilMacMullen about 2 years

    I've just upgraded my ASP web API project from .Net core 2.0 to 3.0. I was using

         services.AddMvc()
                 .AddJsonOptions(options =>options.SerializerSettings.ContractResolver 
                                           = new DefaultContractResolver());
    

    previously to ensure lower-casing of the serialized JSON.

    After the upgrade to 3.0 I get this error:

    Error CS1061 'IMvcBuilder' does not contain a definition for 'AddJsonOptions' and no accessible extension method 'AddJsonOptions' accepting a first argument of type 'IMvcBuilder' could be found (are you missing a using directive or an assembly reference?)

    According to AddJsonOptions for MvcJsonOptions in Asp.Net Core 2.2 the AddJsonOptions extension method is/was provided by the Microsoft.AspNetCore.Mvc.Formatters.Json nuget package. I have tried installing/reinstalling this but still can't resolve the method. Interestingly, intellisense only shows Microsoft.AspNetCore.Mvc.Formatters.Xml when I try to add the using statement even though I added the Json nuget package.

    Any ideas what is going on? The documentation for AddJsonOptions only goes up to .Net 2.2 so perhaps the method has been deprecated in 3.0 in favor of some other configuration mechanism?

  • NeilMacMullen
    NeilMacMullen about 5 years
    For those following along at home... when migrating a project you may need to add a nuget reference to "Microsoft.AspNetCore.Mvc.NewtonsoftJson" to get the "AddNewtonsoftJson" extension. At the time of writing this requires "include prereleases" to be checked if you are using the Visual Studio Nuget manager.
  • poke
    poke about 5 years
    Note that I would generally not recommend migrating to ASP.NET Core 3 with real applications just yet. If you just want to play around, sure, but there are still a few moving bits before the final release, so you will have to keep that in mind if you want to migrate to it early.
  • verbedr
    verbedr over 4 years
    This can trigger "Synchronous operations are disallowed" check stackoverflow.com/questions/47735133/… for more info
  • poke
    poke over 4 years
    @verbedr It should work in the current previews of ASP.NET Core 3.0 though. The bug was fixed for preview 4.
  • verbedr
    verbedr over 4 years
    @poke it is solved with small payloads if you get a larger response the error is still there. This is the exception I just got with the latest (preview 8) library. System.InvalidOperationException: Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead. ...... at Newtonsoft.Json.Utilities.JavaScriptUtils.WriteEscapedJavaSc‌​riptString(TextWrite‌​r writer, String s, Char delimiter, Boolean appendDelimiters, Boolean[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, IArrayPool`1 bufferPool, Char[]& writeBuffer)
  • verbedr
    verbedr over 4 years
    @poke FYI so the solution was to buffer the response fully when using Newtonsoft and some other scenarios (github.com/aspnet/AspNetCore/issues/6397) but if it goes above some threshold it will still trigger this error. davidfowl was talking about making it configurable ...
  • James Grey
    James Grey over 4 years
    hard to follow.
  • aruno
    aruno over 4 years
    and what if i DO want to use the new one!
  • poke
    poke over 4 years
    @Simon_Weaver The new JSON serializer is enabled by default so you don’t need to do anything to use it. It does not support as much customization as Json.NET though (that’s one of the big differences) but you can check out the serializer options to see what you can change. You can call AddJsonOptions(…) on the MVC builder to configure the serializer.
  • aruno
    aruno over 4 years
    Thanks. I only just installed 3.0 today so the goal was to just get it working. I do however have a custom date format I was using but so it was easiest to just revert to Json.NET for now. It was super easy before to set just a date format.
  • Saeed Neamati
    Saeed Neamati over 4 years
    For me AddNewtonsoftJson is missing, even after referencing that Microsoft.AspNetCore.Mvc.NewtonsoftJson reference.
  • Grandizer
    Grandizer over 4 years
    I would assume the line should be: o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
  • poke
    poke over 4 years
    @SaeedNeamati Make sure you have a using Microsoft.Extensions.DependencyInjection to see the AddNewtonsoftJson extension method.
  • Martin
    Martin over 4 years
    Yeah me too, but it does not. This answer worked for me though.
  • avenmore
    avenmore over 4 years
    I found out, after porting to 3.0, that the new JsonSerializer doesn't respect the [IgnoreDataMember] attribute.
  • poke
    poke over 4 years
    @avenmore The new serializer uses a separate set of attributes. You can use [JsonIgnore] from the System.Text.Json.Serialization namespace.
  • avenmore
    avenmore over 4 years
    @poke Yes, thank you, it was just a gotcha where behaviour changed silently and errors appeared on the client. It was mentioned in this Github issue that anything coming from the System.Runtime.Serialization namespace will never be supported.
  • Shahar Shokrani
    Shahar Shokrani over 4 years
    No need for o.JsonSerializerOptions.DictionaryKeyPolicy = null; and o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
  • Sergey Nikitin
    Sergey Nikitin over 4 years
    I've used only AddJsonFormatters() extension method: services.AddMvcCore().AddJsonFormatters() - will it be enough to use services.AddMvcCore().AddNewtonsoftJson() for replacement?
  • Rudey
    Rudey over 4 years
    FYI, AddNewtonsoftJson has to be chained after AddControllers. services.AddNewtonsoftJson() does not work.
  • Eric
    Eric about 4 years
    I wish I could use this answer, but my application was built using Newtonsoft attributes, which the new MS serializer ignores, meaning that I have to continue using the Newtonsoft serializer with AddNewtonsoftJson. Maybe MS could add an option to respect Newtonsoft attributes, while still getting the performance gains they are promising.
  • Mohammad Olfatmiri
    Mohammad Olfatmiri about 4 years
    @eric Yes you are right but, Newtonsoft performance is enough for most of the situations.
  • Louis
    Louis over 3 years
    Adding Microsoft.AspNetCore.Mvc.NewtonsoftJson, I got an error: NU1202: Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 5.0.0 is not compatible with netcoreapp3.0.
  • poke
    poke over 3 years
    @Louis If you are using ASP.NET Core 3.1, you will need to add version 3.1.x of that package. If you are using ASP.NET Core 3.0 (which isn’t supported any more), you will need to add version 3.0.x of that package.
  • Rodney
    Rodney over 2 years
    Creating a dotnet 5 aspnet app for the first time, after years working with .net framework onward, found that controller simply did not return objects, just strings. This solution resolved the issue. I don't follow every nuanced change and the serialization option syntax seems to change every year (I prefer pascal case) but this was, have to admit, a bit scary. All's well that ends well, thank you.
  • Admin
    Admin about 2 years
    Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
  • MD. RAKIB HASAN
    MD. RAKIB HASAN about 2 years
    This does not really answer the question. If you have a different question, you can ask it by clicking Ask Question. To get notified when this question gets new answers, you can follow this question. Once you have enough reputation, you can also add a bounty to draw more attention to this question. - From Review