services.AddControllers().AddNewtonsoftJson() doesn't override System.Text.Json
See original GitHub issueFrom @Yannick183 on Wednesday, August 28, 2019 8:16:27 AM
Issue Title
services.AddControllers().AddNewtonsoftJson() doesn’t seem to override System.Text.Json
General
I tried to upgrade a WebAPI project from dotnetcore 2.2 to version 3 but I’m facing some issues with Json serialization.
Using version 3.0.100-preview8-013656, I tried to override System.Text.Json by adding this to ConfigureServices
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new StringEnumConverter(new CamelCaseNamingStrategy()));
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
Some of my controller endpoints fail with a HTTP500 error because of some circular references that should have been prevented by the [JsonIgnore]
attribute. The error is the following :
System.Text.Json.JsonException: CurrentDepth (32) is equal to or larger than the maximum allowed depth of 32.
As you can see, the error comes from System.Text.Json.JsonException
which I suspect means that Newtonsoft.Json isn’t used by the controller to serialize the response.
I use ModelMetadataType
to add [JsonIgnore]
to some attributes like this. I even tried adding System.Text.Json.Serialization.JsonIgnore
to the property but without any result.
[ModelMetadataType(typeof(ISomeEntityClassMetadata))]
public partial class SomeEntityClass : ISomeEntityClassMetadata
{
}
public interface ISomeEntityClassMetadata
{
[System.Text.Json.Serialization.JsonIgnore]
[JsonIgnore]
SomeOtherEntityClass SomeOtherEntityNavigation { get; set; }
}
Copied from original issue: dotnet/core#3269
Issue Analytics
- State:
- Created 4 years ago
- Reactions:4
- Comments:10 (4 by maintainers)
Just ran into this myself; I have to say, it’s very strange that the
.AddNewtonsoftJson()
method behaves in this way - that is, that it’s available, and doesn’t throw an error, when the relevant NuGet package isn’t even installed.Either way, while you’re right, it would be nice if the documentation properly explained how this should work, it would be even nicer if the code didn’t let developers get into this baffling situation.
OK now I feel stupid. @remyjette I realized I didn’t have
Microsoft.AspNetCore.Mvc.NewtonsoftJson
I only hadNewtonsoft.Json
installed but since I had the.AddNewtonsoftJson()
extension method available I thought it was enough. I was unable to find it in NuGet GUIMicrosoft.AspNetCore.Mvc.NewtonsoftJson
so my guess was that package was used for previous versions only. I then tried to install it from command lineInstall-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0-preview8.19405.7
and it worked. NowSystem.Text.Json
is overriden as expected and the circular reference problem is gone.I don’t know why I couldn’t find the package from NuGet GUI though. You can see below that the search term doesn’t provide any result for
Microsoft.AspNetCore.Mvc.NewtonsoftJson
but the command line worked.Using Visual Studio 2019 16.3.0 Preview 2.0