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/…Respostas:
Juntando tudo, você obtém ...
fonte
json.UseDataContractJsonSerializer = true;
faz? Diz ao WebAPI para não usarJson.Net
para serialização. > _ <Isto é o que funcionou para mim:
E depois:
A classe
CamelCasePropertyNamesContractResolver
vemNewtonsoft.Json.dll
em Json.NET biblioteca.fonte
Acontece que
foi o culpado, fazendo com que o processo de serialização ignorasse a configuração do caso de camelo. E essa
era o andróide que eu procurava.
Além disso
Estava colocando uma chave inglesa nas obras e descobri que NÃO era o andróide que eu procurava.
fonte
Json(result)
estava vendo tudo em PascalCase, mas quando volteiContent(StatusCode, result)
funcionava como o esperado.Todas as respostas acima não funcionaram para mim com Owin Hosting e Ninject. Aqui está o que funcionou para mim:
A principal diferença é: new HttpConfiguration () em vez de GlobalConfiguration.Configuration.
fonte
Código de WebApiConfig:
Certifique-se de que o método de ação da API retorne dados da seguinte maneira e de que você tenha instalado a versão mais recente do Json.Net/Newtonsoft.Json:
fonte
Em seu Owin Startup, adicione esta linha ...
fonte
Aqui está um obscuro, quando o atributo de rota não correspondia ao URL GET, mas o url GET correspondia ao nome do método, a diretiva jsonserializer camel case seria ignorada, por exemplo
fonte
Eu resolvi isso das seguintes maneiras.
fonte
Estou usando o WebApi com o Breeze e corri o mesmo problema ao tentar executar uma ação não brisa em um controlador brisa. Tentei usar o Apprach Request.GetConfiguration mas o mesmo resultado. Então, quando eu acesso o objeto retornado por Request.GetConfiguration eu percebo que o serializador usado por request é aquele que o servidor do breeze usa para fazer sua mágica. De qualquer forma, resolvi meu problema criando um HttpConfiguration diferente:
e passando-o como parâmetro em Request.CreateResponse da seguinte forma:
fonte