ATUALIZAR
Obrigado por todas as respostas. Estou em um novo projeto e parece que finalmente cheguei ao fundo disso: parece que o código a seguir era de fato o culpado:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
em outro lugar...
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");
}
Eu tinha esquecido o JsonContent de aparência inócua presumindo que fosse WebAPI, mas não.
Isso é usado em todos os lugares ... Posso ser o primeiro a dizer, wtf? Ou talvez devesse ser "Por que eles estão fazendo isso?"
segue a pergunta original
Alguém poderia pensar que essa seria uma configuração simples, mas ela me iludiu por muito tempo.
Eu tenho olhado para várias soluções e respostas:
https://gist.github.com/rdingwall/2012642
não parece se aplicar à versão mais recente da WebAPI ...
O seguinte parece não funcionar - os nomes das propriedades ainda são PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
A resposta de Mayank aqui: CamelCase JSON WebAPI Sub-objetos (objetos aninhados, objetos filhos) parecia uma resposta insatisfatória, mas viável, até que percebi que esses atributos teriam que ser adicionados ao código gerado, pois estamos usando linq2sql ...
Alguma maneira de fazer isso automaticamente? Este 'desagradável' tem me atormentado por um longo tempo.
JsonSerializer
. stackoverflow.com/questions/13274625/…