AKTUALISIEREN
Danke für alle Antworten. Ich bin in einem neuen Projekt und es sieht so aus, als wäre ich endlich auf den Grund gegangen: Es sieht so aus, als ob der folgende Code tatsächlich schuld war:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
anderswo...
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");
}
Ich hatte den harmlos aussehenden JsonContent übersehen, vorausgesetzt, es war WebAPI, aber nein.
Dies wird überall verwendet ... Kann ich nur der Erste sein, der sagt, wtf? Oder vielleicht sollte das lauten: "Warum machen sie das?"
ursprüngliche Frage folgt
Man hätte gedacht, dass dies eine einfache Konfigurationseinstellung wäre, aber sie ist mir jetzt zu lange entgangen.
Ich habe mir verschiedene Lösungen und Antworten angesehen:
https://gist.github.com/rdingwall/2012642
scheint nicht auf die neueste WebAPI-Version zuzutreffen ...
Folgendes scheint nicht zu funktionieren - Eigenschaftsnamen sind immer noch PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Mayanks Antwort hier: CamelCase JSON WebAPI- Unterobjekte (verschachtelte Objekte, untergeordnete Objekte) schienen eine unbefriedigende, aber praktikable Antwort zu sein, bis mir klar wurde, dass diese Attribute dem generierten Code hinzugefügt werden müssen, da wir linq2sql verwenden ...
Wie kann man das automatisch machen? Dieses "böse" hat mich schon lange geplagt.
JsonSerializer
. stackoverflow.com/questions/13274625/…Antworten:
Wenn Sie alles zusammenfügen, erhalten Sie ...
quelle
json.UseDataContractJsonSerializer = true;
macht? Es weist WebAPI an, nichtJson.Net
für die Serialisierung zu verwenden. > _ <Das hat bei mir funktioniert:
Und dann:
Die Klasse
CamelCasePropertyNamesContractResolver
kommt ausNewtonsoft.Json.dll
in Json.NET Bibliothek.quelle
Es stellt sich heraus, dass
war der Schuldige, was dazu führte, dass der Serialisierungsprozess die Camelcase-Einstellung ignorierte. Und das
war der Droide, den ich suchte.
Ebenfalls
Ich habe einen Schraubenschlüssel in die Arbeit gesteckt und mich als NICHT den Droiden herausgestellt, den ich gesucht habe.
quelle
Json(result)
meiner Rückkehr sah ich alles in PascalCase, aber als ich zurückkamContent(StatusCode, result)
, funktionierte es wie erwartet.Alle oben genannten Antworten haben bei Owin Hosting und Ninject nicht funktioniert. Folgendes hat bei mir funktioniert:
Der Hauptunterschied ist: new HttpConfiguration () anstelle von GlobalConfiguration.Configuration.
quelle
Code von WebApiConfig:
Stellen Sie sicher, dass Ihre API-Aktionsmethode Daten auf folgende Weise zurückgibt und Sie die neueste Version von Json.Net/Newtonsoft.Json installiert installiert haben:
quelle
Fügen Sie in Ihrem Owin-Startup diese Zeile hinzu ...
quelle
Hier ist eine obskure, wenn das Routenattribut nicht mit der GET-URL übereinstimmt, aber die GET-URL mit dem Methodennamen übereinstimmt, wird die jsonserializer-Kamelfallanweisung ignoriert, z
quelle
Ich habe es auf folgende Weise gelöst.
quelle
Ich verwende WebApi mit Breeze und habe das gleiche Problem ausgeführt, als ich versucht habe, eine Non-Breeze-Aktion in einem Breeze-Controller auszuführen. Ich habe versucht, die apprach Request.GetConfiguration zu verwenden, aber das gleiche Ergebnis. Wenn ich also auf das von Request.GetConfiguration zurückgegebene Objekt zugreife, stelle ich fest, dass der von Request verwendete Serializer derjenige ist, den der Breeze-Server verwendet, um seine Magie zu erzeugen. Auf jeden Fall habe ich mein Problem beim Erstellen einer anderen HttpConfiguration behoben:
und Übergabe als Parameter bei Request.CreateResponse wie folgt:
quelle