ACTUALIZAR
Gracias por todas las respuestas. Estoy en un nuevo proyecto y parece que finalmente llegué al fondo de esto: parece que el siguiente código fue de hecho el culpable:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
en otra parte...
public JsonContent(object obj)
{
var encoded = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore } );
_value = JObject.Parse(encoded);
Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
Había pasado por alto el JsonContent de aspecto inocuo asumiendo que era WebAPI, pero no.
Esto se usa en todas partes ... ¿Puedo ser el primero en decir, wtf? O tal vez debería ser "¿Por qué están haciendo esto?"
sigue la pregunta original
Uno hubiera pensado que esto sería una configuración de configuración simple, pero se me ha eludido durante demasiado tiempo.
He analizado varias soluciones y respuestas:
https://gist.github.com/rdingwall/2012642
no parece aplicarse a la última versión de WebAPI ...
Lo siguiente no parece funcionar: los nombres de las propiedades siguen siendo PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
La respuesta de Mayank aquí: Los subobjetos CamelCase JSON WebAPI (objetos anidados, objetos secundarios) parecían una respuesta insatisfactoria pero viable hasta que me di cuenta de que estos atributos tendrían que agregarse al código generado ya que estamos usando linq2sql ...
¿Alguna forma de hacer esto automáticamente? Este 'desagradable' me ha atormentado durante mucho tiempo.
JsonSerializer
. stackoverflow.com/questions/13274625/…Respuestas:
Poniéndolo todo junto, obtienes ...
fuente
json.UseDataContractJsonSerializer = true;
hace? Le dice a WebAPI que no se utiliceJson.Net
para la serialización. > _ <Esto es lo que funcionó para mí:
Y entonces:
La clase
CamelCasePropertyNamesContractResolver
proviene deNewtonsoft.Json.dll
en Json.NET biblioteca.fuente
Resulta que
fue el culpable, lo que provocó que el proceso de serialización ignorara la configuración de camelcase. Y eso
era el droide que estaba buscando.
también
Estaba poniendo una llave inglesa en las obras y resultó NO ser el droide que estaba buscando.
fuente
Json(result)
, estaba viendo todo en PascalCase, pero cuando regreséContent(StatusCode, result)
funcionó como se esperaba.Todas las respuestas anteriores no me funcionaron con Owin Hosting y Ninject. Esto es lo que funcionó para mí:
La diferencia clave es: new HttpConfiguration () en lugar de GlobalConfiguration.Configuration.
fuente
Código de WebApiConfig:
Asegúrese de que su método de acción de API devuelva datos de la siguiente manera y que haya instalado la última versión de Json.Net/Newtonsoft.Json instalada:
fuente
En su Owin Startup agregue esta línea ...
fuente
Aquí hay uno oscuro, cuando el atributo de ruta no coincide con la URL GET pero la URL GET coincide con el nombre del método, la directiva jsonserializer camel case se ignoraría, por ejemplo
fuente
Lo he resuelto de la siguiente manera.
fuente
Estoy usando WebApi con Breeze y encontré el mismo problema cuando intenté ejecutar una acción que no es de brisa en un controlador de brisa. Traté de usar el apprach Request.GetConfiguration pero el mismo resultado. Entonces, cuando accedo al objeto devuelto por Request.GetConfiguration, me doy cuenta de que el serializador usado por solicitud es el que usa el servidor de brisa para hacer su magia. De cualquier forma, resolví mi problema creando una HttpConfiguration diferente:
y pasándolo como parámetro en Request.CreateResponse de la siguiente manera:
fuente