Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0?
Asked Answered
B

7

200

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

services.AddMvc()
    .AddJsonOptions(opts => opts.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?

Billybillycock answered 13/4, 2019 at 14:58 Comment(0)
H
334

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();
    });
Hispaniola answered 13/4, 2019 at 15:7 Comment(20)
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.Billybillycock
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.Hispaniola
This can trigger "Synchronous operations are disallowed" check #47735633 for more infoMizuki
@Mizuki It should work in the current previews of ASP.NET Core 3.0 though. The bug was fixed for preview 4.Hispaniola
@Hispaniola 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.WriteEscapedJavaScriptString(TextWriter writer, String s, Char delimiter, Boolean appendDelimiters, Boolean[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, IArrayPool`1 bufferPool, Char[]& writeBuffer)Mizuki
@Hispaniola 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 ...Mizuki
hard to follow.Abaddon
and what if i DO want to use the new one!Hemicellulose
@Hemicellulose 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.Hispaniola
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.Hemicellulose
For me AddNewtonsoftJson is missing, even after referencing that Microsoft.AspNetCore.Mvc.NewtonsoftJson reference.Ava
@SaeedNeamati Make sure you have a using Microsoft.Extensions.DependencyInjection to see the AddNewtonsoftJson extension method.Hispaniola
I found out, after porting to 3.0, that the new JsonSerializer doesn't respect the [IgnoreDataMember] attribute.Dielectric
@Dielectric The new serializer uses a separate set of attributes. You can use [JsonIgnore] from the System.Text.Json.Serialization namespace.Hispaniola
@Hispaniola 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.Dielectric
I've used only AddJsonFormatters() extension method: services.AddMvcCore().AddJsonFormatters() - will it be enough to use services.AddMvcCore().AddNewtonsoftJson() for replacement?Aimo
FYI, AddNewtonsoftJson has to be chained after AddControllers. services.AddNewtonsoftJson() does not work.Virginavirginal
Adding Microsoft.AspNetCore.Mvc.NewtonsoftJson, I got an error: NU1202: Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 5.0.0 is not compatible with netcoreapp3.0.Spangler
@Spangler 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.Hispaniola
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.Gussie
W
35

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

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});
Woodyard answered 14/10, 2019 at 11:23 Comment(5)
I would assume the line should be: o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;Iridosmine
Yeah me too, but it does not. This answer worked for me though.Apteryx
No need for o.JsonSerializerOptions.DictionaryKeyPolicy = null; and o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;Vagina
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.Mccombs
@eric Yes you are right but, Newtonsoft performance is enough for most of the situations.Woodyard
C
22

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

enter image description here

Chloe answered 14/7, 2021 at 8:15 Comment(0)
C
6

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.

Corkage answered 3/6, 2021 at 6:18 Comment(0)
C
5

This would help try Installing the Nuget Package

Microsoft.AspNetCore.Mvc.NewtonsoftJson

Calibrate answered 16/10, 2020 at 20:38 Comment(0)
L
4

This would help

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddJsonOptions(options=> {  options.JsonSerializerOptions.PropertyNamingPolicy = null;
                 options.JsonSerializerOptions.DictionaryKeyPolicy = null;

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
Lacefield answered 7/4, 2020 at 17:36 Comment(0)
D
-1

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

Describe answered 17/3, 2022 at 7:57 Comment(2)
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.Sidestroke
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 ReviewArmendariz

© 2022 - 2024 — McMap. All rights reserved.