AKTUALIZACJA
Dzięki za wszystkie odpowiedzi. Jestem nad nowym projektem i wygląda na to, że w końcu dotarłem do sedna tego: Wygląda na to, że w rzeczywistości winien był następujący kod:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
gdzie indziej...
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");
}
Przeoczyłem niewinnie wyglądający JsonContent, zakładając, że to WebAPI, ale nie.
To jest używane wszędzie ... Czy mogę być pierwszym, który powie, wtf? A może powinno to brzmieć „Dlaczego oni to robią?”
pojawia się oryginalne pytanie
Można by pomyśleć, że to proste ustawienie konfiguracji, ale teraz umykało mi to zbyt długo.
Patrzyłem na różne rozwiązania i odpowiedzi:
https://gist.github.com/rdingwall/2012642
wydaje się, że nie ma zastosowania do najnowszej wersji WebAPI ...
Poniższe wydaje się nie działać - nazwy właściwości są nadal PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Odpowiedź Mayanka tutaj: Podobiekty CamelCase JSON WebAPI (obiekty zagnieżdżone, obiekty potomne) wydawały się niezadowalającą, ale wykonalną odpowiedzią, dopóki nie zdałem sobie sprawy, że te atrybuty będą musiały zostać dodane do wygenerowanego kodu, ponieważ używamy linq2sql ...
Jakiś sposób, aby zrobić to automatycznie? To „paskudne” nęka mnie od dawna.
JsonSerializer
. stackoverflow.com/questions/13274625/…Odpowiedzi:
Łącząc to wszystko razem, otrzymujesz ...
źródło
json.UseDataContractJsonSerializer = true;
robi? Mówi WebAPI, aby nie używać goJson.Net
do serializacji. > _ <Oto, co zadziałało dla mnie:
I wtedy:
Klasa
CamelCasePropertyNamesContractResolver
pochodziNewtonsoft.Json.dll
w Json.NET bibliotece.źródło
Okazało się, że
był winowajcą, powodując, że proces serializacji ignorował ustawienie camelcase. I to
był droidem, którego szukałem.
Również
Wkładałem klucz do robót i okazało się, że NIE jest to robot, którego szukałem.
źródło
Json(result)
widziałem wszystko w PascalCase, ale kiedy wróciłemContent(StatusCode, result)
, działało zgodnie z oczekiwaniami.Wszystkie powyższe odpowiedzi nie zadziałały dla mnie z Owin Hosting i Ninject. Oto, co zadziałało dla mnie:
Kluczowa różnica to: nowa HttpConfiguration () zamiast GlobalConfiguration.Configuration.
źródło
Kod WebApiConfig:
Upewnij się, że metoda akcji interfejsu API zwraca dane w następujący sposób i masz zainstalowaną najnowszą wersję Json.Net/Newtonsoft.Json Installed:
źródło
W swoim Owin Startup dodaj tę linię ...
źródło
Oto niejasny, gdy atrybut route nie pasuje do adresu URL GET, ale adres URL GET pasuje do nazwy metody, dyrektywa jsonserializer camel case zostanie zignorowana, np.
źródło
Rozwiązałem to w następujący sposób.
źródło
Używam WebApi z Breeze i napotkałem ten sam problem, gdy próbowałem wykonać akcję niepowściągliwą w kontrolerze breeze. Próbowałem użyć metody Request.GetConfiguration, ale ten sam wynik. Tak więc, kiedy uzyskuję dostęp do obiektu zwróconego przez Request.GetConfiguration zdaję sobie sprawę, że serializator używany przez request jest tym, którego używa breeze-server do stworzenia magii. W każdym razie rozwiązałem problem, tworząc inną konfigurację HttpConfiguration:
i przekazując go jako parametr w Request.CreateResponse w następujący sposób:
źródło