ОБНОВИТЬ
Спасибо за ответы на все вопросы. Я работаю над новым проектом, и, похоже, я наконец дошел до сути: похоже, что на самом деле виноват следующий код:
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 ...
Как сделать это автоматически? Эта «мерзость» преследует меня уже давно.