Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0?
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.
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.
Related videos on Youtube
NeilMacMullen
Updated on March 17, 2022Comments
-
NeilMacMullen about 2 years
I've just upgraded my ASP web API project from .
Net core 2.0
to3.0
. I was usingservices.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 about 5 yearsFor 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 about 5 yearsNote 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 over 4 yearsThis can trigger "Synchronous operations are disallowed" check stackoverflow.com/questions/47735133/… for more info
-
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 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.WriteEscapedJavaScriptString(TextWriter writer, String s, Char delimiter, Boolean appendDelimiters, Boolean[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, IArrayPool`1 bufferPool, Char[]& writeBuffer)
-
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 over 4 yearshard to follow.
-
aruno over 4 yearsand what if i DO want to use the new one!
-
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 over 4 yearsThanks. 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 over 4 yearsFor me
AddNewtonsoftJson
is missing, even after referencing thatMicrosoft.AspNetCore.Mvc.NewtonsoftJson
reference. -
Grandizer over 4 yearsI would assume the line should be:
o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
-
poke over 4 years@SaeedNeamati Make sure you have a
using Microsoft.Extensions.DependencyInjection
to see theAddNewtonsoftJson
extension method. -
Martin over 4 yearsYeah me too, but it does not. This answer worked for me though.
-
avenmore over 4 yearsI found out, after porting to 3.0, that the new JsonSerializer doesn't respect the
[IgnoreDataMember]
attribute. -
poke over 4 years@avenmore The new serializer uses a separate set of attributes. You can use
[JsonIgnore]
from theSystem.Text.Json.Serialization
namespace. -
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 over 4 yearsNo need for
o.JsonSerializerOptions.DictionaryKeyPolicy = null;
ando.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
-
Sergey Nikitin over 4 yearsI've used only AddJsonFormatters() extension method: services.AddMvcCore().AddJsonFormatters() - will it be enough to use services.AddMvcCore().AddNewtonsoftJson() for replacement?
-
Rudey over 4 yearsFYI,
AddNewtonsoftJson
has to be chained afterAddControllers
.services.AddNewtonsoftJson()
does not work. -
Eric about 4 yearsI 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 about 4 years@eric Yes you are right but, Newtonsoft performance is enough for most of the situations.
-
Louis over 3 yearsAdding Microsoft.AspNetCore.Mvc.NewtonsoftJson, I got an error: NU1202: Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 5.0.0 is not compatible with netcoreapp3.0.
-
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 version3.0.x
of that package. -
Rodney over 2 yearsCreating 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 about 2 yearsYour 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 about 2 yearsThis 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