Estou usando o GSON para converter dados JSON que recebo em um objeto Java. Funciona muito bem em todos os meus testes. O problema é que nossos objetos reais têm algumas propriedades nomeadas como is_online. GSON apenas os mapeia se eles forem nomeados totalmente iguais, seria bom ter GSON convertendo os nomes para Java camel case isOnline.
Parece que isso é possível durante a criação dos dados JSON, caso camelo é convertido em palavras separadas por sublinhado em JSON. Mas não consigo encontrar uma maneira de especificar isso ao contrário.
java
json
gson
camelcasing
Janusz
fonte
fonte
Respostas:
Descobri que a configuração a seguir funciona perfeitamente ao ler json com atributos sublinhados e usar camelcasing em meus modelos.
fonte
Você pode usar a
SerializedName
anotação:Nota: Quando você já tiver definido um
FieldNamingPolicy
,SerializedName
o substituirá suas configurações para aquele campo específico (bastante útil para casos especiais).fonte
Tenha em mente que seu exemplo é um caso extremo. Se você tem uma propriedade 'foo', seu getter deve ser nomeado como 'getFoo', e se você tem uma propriedade chamada 'foo_bar', seu getter deve ser chamado de 'getFooBar', no entanto, em seu exemplo você está mapeando um booleano e os booleanos têm convenções de nomenclatura de casos especiais em java. Uma propriedade booleana primitiva chamada online deve ter um getter chamado 'isOnline', NÃO 'getOnline' ou ainda pior, 'getIsOnline'. Um objeto wrapper booleano (ou seja, booleano) não deve seguir este caso especial e uma propriedade chamada 'online' deve ter um getter chamado 'getOnline'.
Portanto, ter propriedades booleanas com 'is' no nome é um caso extremo, em que você desejará remover esse prefixo específico durante a conversão. Na direção inversa, seu código pode querer inspecionar o objeto json tanto para um nome de propriedade bruto quanto para uma versão 'is_XXX'.
fonte
Acho que o que você quer está aqui . Usando anotações, você pode dizer ao GSON que o mySuperCoolField é na verdade chamado this_field_is_fun no JSON e ele o descompactará corretamente. Pelo menos acho que funciona para desserialização também.
Se isso não funcionar, você pode usar o JsonSerializer / JsonDeserializers personalizado, que funciona muito bem, mas é necessário atualizá-los para alterações em sua classe (como quando você adiciona um campo). Você perde a magia automática.
A coisa mais fácil de fazer (o que seria feio, mas muito limpo e simples se a primeira sugestão não funcionar) seria simplesmente nomear o campo de forma a deixar GSON feliz e adicionar métodos acessadores extras com os nomes que você gosta , por exemplo
fonte