METTRE À JOUR
Merci pour toutes les réponses. Je suis sur un nouveau projet et il semble que je suis enfin arrivé au fond des choses: il semble que le code suivant était en fait à blâmer:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
autre part...
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");
}
J'avais oublié le JsonContent à l'aspect inoffensif en supposant que c'était WebAPI mais non.
Ceci est utilisé partout ... Puis-je être le premier à dire, wtf? Ou peut-être que cela devrait être "Pourquoi font-ils cela?"
la question originale suit
On aurait pensé que ce serait un simple paramètre de configuration, mais cela m'échappe depuis trop longtemps.
J'ai examiné différentes solutions et réponses:
https://gist.github.com/rdingwall/2012642
ne semble pas s'appliquer à la dernière version de WebAPI ...
Ce qui suit ne semble pas fonctionner - les noms de propriétés sont toujours en PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
La réponse de Mayank ici: Les sous-objets CamelCase JSON WebAPI (objets imbriqués, objets enfants) semblaient être une réponse insatisfaisante mais réalisable jusqu'à ce que je réalise que ces attributs devraient être ajoutés au code généré car nous utilisons linq2sql ...
Un moyen de le faire automatiquement? Ce «méchant» me tourmente depuis longtemps maintenant.
JsonSerializer
. stackoverflow.com/questions/13274625/…Réponses:
En mettant tout cela ensemble, vous obtenez ...
la source
json.UseDataContractJsonSerializer = true;
fait? Il indique à WebAPI de ne pas l'utiliserJson.Net
pour la sérialisation. > _ <C'est ce qui a fonctionné pour moi:
Puis:
La classe
CamelCasePropertyNamesContractResolver
vientNewtonsoft.Json.dll
dans Json.NET bibliothèque.la source
Il se trouve que
était le coupable, ce qui a amené le processus de sérialisation à ignorer le paramètre camelcase. Et cela
était le droïde que je cherchais.
Aussi
Mettait une clé dans les travaux et s'est avéré être PAS le droïde que je recherchais.
la source
Json(result)
, je voyais tout dans PascalCase, mais quand je suis revenu,Content(StatusCode, result)
cela fonctionnait comme prévu.Toutes les réponses ci-dessus n'ont pas fonctionné pour moi avec Owin Hosting et Ninject. Voici ce qui a fonctionné pour moi:
La principale différence est: new HttpConfiguration () plutôt que GlobalConfiguration.Configuration.
la source
Code de WebApiConfig:
Assurez-vous que votre méthode d'action API renvoie les données de la manière suivante et que vous avez installé la dernière version de Json.Net/Newtonsoft.Json Installed:
la source
Dans votre Owin Startup, ajoutez cette ligne ...
la source
En voici un obscur, lorsque l'attribut route ne correspondait pas à l'url GET mais que l'url GET correspondait au nom de la méthode, la directive jsonserializer camel case serait ignorée, par exemple
la source
Je l'ai résolu de différentes manières.
la source
J'utilise WebApi avec Breeze et j'ai rencontré le même problème en essayant d'exécuter une action non-Breeze dans un contrôleur Breeze. J'ai essayé d'utiliser le Request.GetConfiguration d'apprach mais le même résultat. Ainsi, lorsque j'accède à l'objet renvoyé par Request.GetConfiguration, je me rends compte que le sérialiseur utilisé par request est celui que breeze-server utilise pour faire de la magie. Quoi qu'il en soit, j'ai résolu mon problème en créant une configuration HttpConfiguration différente:
et en le passant comme paramètre à Request.CreateResponse comme suit:
la source