Las propiedades JSON ahora en minúsculas al cambiar de ASP .Net Core 1.0.0-rc2-final a 1.0.0

90

Acabo de cambiar nuestro proyecto de ASP .Net Core 1.0.0-rc2-final a 1.0.0. Nuestro sitio web y nuestro cliente han dejado de funcionar debido a la capitalización de las propiedades JSON. Por ejemplo, esta línea de JavaScript ahora falla

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

porque el controlador ahora llama a la matriz "elementos" en lugar de "elementos". No he realizado cambios más allá de instalar los paquetes actualizados y editar el archivo project.json. No he cambiado los archivos de modelo de C # que todavía capitalizan sus propiedades.

¿Por qué los controladores ASP.Net Core comenzaron a devolver JSON con propiedades en minúsculas? ¿Cómo vuelvo a que respeten el caso de los nombres de propiedad del modelo?

dumbledad
fuente
2
Para aquellos de ustedes que buscan la respuesta para .Net Core 3, deben desplazarse hacia abajo hasta la parte inferior de la página.
Mike Devenney

Respuestas:

157

MVC ahora serializa JSON con nombres de casos de camello de forma predeterminada

Utilice este código para evitar nombres de casos de camellos de forma predeterminada

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

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

Oleksandr Fentsyk
fuente
8
netcore2: usando Newtonsoft.Json.Serialization;
david.barkhuizen
3
No quiero cambiar toda mi serialización JSON, solo un caso particular que debe coincidir con el comportamiento de algún software de terceros. ¿Cómo se proporciona la configuración de serialización correcta en el segundo parámetro de la Json()llamada?
Auspex
79

En caso de que encuentre esto en Google y busque una solución para Core 3.

Utiliza Core 3 System.Text.Json, que por defecto no conserva el caso. Como se mencionó con este problema de GitHub , establecer el valor PropertyNamingPolicynulo solucionará el problema.

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

y si no desea cambiar la configuración global, solo para una acción es así:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });
Ron Rebennack
fuente
8
eres mi señor y salvador
Jonty Morris
1
Esto funcionó bien para mí en Core 3.1. No pude hacer que mis componentes de kendo funcionaran correctamente y encontré que el json estaba formateado en caso de camello. Esto resolvió el problema.
Waragi
Yo también soy tu tema
João Loureiro
9

Para aquellos que migraron a Core 3.1 y tienen un proyecto Core MVC, pueden usar el siguiente código de configuración en Startup.cs:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }
UY
fuente
Esto es lo mismo que una respuesta anterior stackoverflow.com/a/58187836/125981
Mark Schultheiss
@MarkSchultheiss probablemente tenga razón, ya que mi respuesta es similar a todas las demás, sin embargo, cuando buscaba la respuesta adecuada en función de mi tipo de proyecto, que es MVC utilizando vistas, no encontré una respuesta exacta que coincida con mi proyecto. AddControllersWithViews () agrega esas piezas que faltan, y pensé que sería útil para cualquiera en el futuro. ¡Gracias por tu comentario!
UY
3

Esto lo solucionará en dotnet core 3 webapi, de modo que no cambie los nombres de sus propiedades en absoluto, y le devuelva a su cliente exactamente lo que pretendía.

En Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }
RouterBox
fuente
Esto es lo mismo que una respuesta anterior stackoverflow.com/a/58187836/125981
Mark Schultheiss
1

Para alguien que está usando ASP.net WEB API (en lugar de ASP.NET Core).

Agregue esta línea en su WebApiConfig.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Agregando esto como una respuesta aquí porque esto también aparece primero en la búsqueda de Google para la API web.

Abdul Rehman Sayed
fuente
0

Para las versiones Core 2.x, con este código puede evitar los nombres de casos de camello de forma predeterminada. Debe agregar el siguiente código dentro del método ConfigureServices del archivo Startup.cs.

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

        castedResolver.NamingStrategy = null;
    }
});
Asiri Jayaweera
fuente