ChatGPT解决这个技术问题 Extra ChatGPT

JSON properties now lower case on swap from ASP .Net Core 1.0.0-rc2-final to 1.0.0

I've just swapped our project from ASP .Net Core 1.0.0-rc2-final to 1.0.0. Our website and client have stopped working because of the capitalization of JSON properties. For example, this line of JavaScript now fails

for (var i = 0; i < collection.Items.length; i++){

because the controller now calls the array "items" instead of "Items". I have made no changes beyond installing the updated packages and editing the project.json file. I have not changed the C# model files which still capitalize their properties.

Why have the ASP.Net Core controllers started returning JSON with lower-cased properties? How do I go back to them honoring the case of the property names from the model?

For those of you looking for the answer for .Net Core 3 you need to scroll down to the bottom of the page.

O
Oleksandr Fentsyk

MVC now serializes JSON with camel case names by default

Use this code to avoid camel case names by default

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

Source: https://github.com/aspnet/Announcements/issues/194


netcore2: using Newtonsoft.Json.Serialization;
I don't want to change all of my JSON serialization, just one particular case that needs to match the behaviour of some third-party software. How does one provide the correct serialization settings in the second parameter of the Json() call?
I
Ian Kemp

In case you found this from Google and looking for a solution for Core 3.

Core 3 uses System.Text.Json, which by default does not preserve the case. As mentioned with this GitHub issue, setting the PropertyNamingPolicy to null will fix the problem.

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

and if you don't want to change the global settings, for one action only it's like this:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

you are my lord and savior
This worked well for me on Core 3.1. I couldn't get my kendo components to work properly and found the json to be camel case formatted. This resolved the issue.
I'm also your subject
S
Stephen Kennedy

You can change the behavior like this:

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

See the announcement here: https://github.com/aspnet/Announcements/issues/194


U
U.Y.

For those who migrated to Core 3.1 and have Core MVC project can use following setup code in Startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

This is the same as a prior answer stackoverflow.com/a/58187836/125981
@MarkSchultheiss you are probably right, as my answer is similar to all the other ones, however, when I was searching proper answer based on my project type, which is MVC utilizing views, I didn't find exact answer matching my project. AddControllersWithViews() adds those missing piece, and I thought it will be useful for anyone in the future. Thank you though for your comment!
R
RouterBox

This will fix it in dotnet core 3 webapi, so that it doesn't change your property names at all, and you return to your client exactly what you intended to.

In Startup.cs:

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

This is the same as a prior answer stackoverflow.com/a/58187836/125981
i
infografnet

For someone who does not want to set it globally, it is possible to use ContractResolver also to return as Json result:

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}

A
Abdul Rehman Sayed

For some one who is using ASP.net WEB API ( rather than ASP.NET Core).

Add this line in your WebApiConfig.

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Adding this as an answer here because this comes up first in google search for web api as well.


A
Asiri Jayaweera

For Core 2.x versions, using this code you can avoid camel case names by default. You need to add following code inside the ConfigureServices method of Startup.cs file.

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now