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?
c#
asp.net-core
asp.net-core-1.0
dumbledad
fuente
fuente
Respuestas:
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
fuente
Json()
llamada?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 valorPropertyNamingPolicy
nulo 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 });
fuente
Puede cambiar el comportamiento de esta manera:
services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
Vea el anuncio aquí: https://github.com/aspnet/Announcements/issues/194
fuente
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); ... }
fuente
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(); }
fuente
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.
fuente
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; } });
fuente