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

C#asp.net Coreasp.net Core-1.0

C# Problem Overview


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?

C# Solutions


Solution 1 - C#

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

Solution 2 - C#

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 });

Solution 3 - C#

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

Solution 4 - C#

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);
            ...
        }

Solution 5 - C#

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();
    }

Solution 6 - C#

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()});
}

Solution 7 - C#

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.

Solution 8 - C#

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;
	}
});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondumbledadView Question on Stackoverflow
Solution 1 - C#Oleksandr FentsykView Answer on Stackoverflow
Solution 2 - C#Ron RebennackView Answer on Stackoverflow
Solution 3 - C#Joe AudetteView Answer on Stackoverflow
Solution 4 - C#U.Y.View Answer on Stackoverflow
Solution 5 - C#RouterBoxView Answer on Stackoverflow
Solution 6 - C#infografnetView Answer on Stackoverflow
Solution 7 - C#Abdul Rehman SayedView Answer on Stackoverflow
Solution 8 - C#Asiri JayaweeraView Answer on Stackoverflow