ОБНОВИТЬ
Спасибо за ответы на все вопросы. Я работаю над новым проектом, и, похоже, я наконец дошел до сути: похоже, что на самом деле виноват следующий код:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
в другом месте ...
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");
}
Я упустил из виду безобидно выглядящий JsonContent, предполагая, что это был WebAPI, но нет.
Это используется везде ... Могу я быть первым, кто скажет, черт возьми? Или, возможно, это должно быть "Почему они это делают?"
оригинальный вопрос следует
Можно было подумать, что это простая настройка конфигурации, но сейчас она ускользнула от меня слишком долго.
Я просмотрел различные решения и ответы:
https://gist.github.com/rdingwall/2012642
похоже, не относится к последней версии WebAPI ...
Следующее, похоже, не работает - имена свойств по-прежнему имеют PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Ответ Mayank здесь: CamelCase JSON WebAPI Sub-Objects (вложенные объекты, дочерние объекты) казались неудовлетворительным, но работоспособным ответом, пока я не понял, что эти атрибуты должны быть добавлены в сгенерированный код, поскольку мы используем linq2sql ...
Как сделать это автоматически? Эта «мерзость» преследует меня уже давно.
JsonSerializer
. stackoverflow.com/questions/13274625/…Ответы:
Собирая все вместе, вы получаете ...
источник
json.UseDataContractJsonSerializer = true;
делает? Он сообщает WebAPI не использовать егоJson.Net
для сериализации. > _ <Вот что сработало для меня:
А потом:
Класс
CamelCasePropertyNamesContractResolver
приходит изNewtonsoft.Json.dll
в Json.NET библиотеке.источник
Оказывается, что
был виновником, из-за чего процесс сериализации игнорировал параметр camelcase. И это
был дроидом, которого я искал.
Также
Вкладывал гаечный ключ в работу и оказался НЕ тем дроидом, которого я искал.
источник
Json(result)
, я все видел в PascalCase, но когда вернулся, все заработало,Content(StatusCode, result)
как ожидалось.Все приведенные выше ответы не сработали для меня с Owin Hosting и Ninject. Вот что у меня сработало:
Ключевое отличие: новый HttpConfiguration (), а не GlobalConfiguration.Configuration.
источник
Код WebApiConfig:
Убедитесь, что ваш метод действий API возвращает данные следующим образом, и что вы установили последнюю версию Json.Net/Newtonsoft.Json Installed:
источник
В вашем запуске Owin добавьте эту строку ...
источник
Вот непонятный случай: когда атрибут маршрута не соответствует URL-адресу GET, но URL-адрес GET соответствует имени метода, директива jsonserializer camel case игнорируется, например
источник
Я решил это следующими способами.
источник
Я использую WebApi с Breeze, и я столкнулся с той же проблемой при попытке выполнить действие без ветра в контроллере Breeze. Я попытался использовать apprach Request.GetConfiguration, но результат тот же. Итак, когда я обращаюсь к объекту, возвращаемому Request.GetConfiguration, я понимаю, что сериализатор, используемый запросом, - это тот, который использует breeze-server, чтобы сделать его волшебным. В любом случае, я решил свою проблему, создав другой HttpConfiguration:
и передав его как параметр в Request.CreateResponse следующим образом:
источник