J'utilise GSON pour convertir les données JSON que j'obtiens en un objet Java. Cela fonctionne plutôt bien dans tous mes tests. Le problème est que nos objets réels ont des propriétés nommées comme is_online. GSON ne les mappe que s'ils sont nommés totalement égaux, ce serait bien que GSON convertisse les noms en Java camel case isOnline.
Il semble que cela soit possible lors de la création des données JSON, la casse du camel est convertie en mots séparés par soulignement dans JSON. Mais je ne peux pas trouver un moyen de spécifier cela dans l'autre sens.
java
json
gson
camelcasing
Janusz
la source
la source
Réponses:
J'ai trouvé que le paramètre suivant fonctionne parfaitement lors de la lecture de json avec des attributs soulignés et de l'utilisation du camelcasing dans mes modèles.
la source
Vous pouvez utiliser l'
SerializedName
annotation:Remarque: lorsque vous avez
FieldNamingPolicy
déjà défini un ,SerializedName
remplacera ses paramètres pour ce champ spécifique (très pratique pour des cas particuliers).la source
Gardez à l'esprit que votre exemple est un cas extrême. Si vous avez une propriété 'foo', son getter doit être nommé 'getFoo', et si vous avez une propriété nommée 'foo_bar', son getter doit être nommé 'getFooBar', cependant, dans votre exemple, vous mappez un booléen et les booléens ont conventions de dénomination des cas spéciaux en java. Une propriété booléenne primitive nommée online devrait avoir un getter nommé 'isOnline', PAS 'getOnline' ou pire encore, 'getIsOnline'. Un objet wrapper booléen (c'est-à-dire Boolean) ne doit pas suivre ce cas particulier et une propriété nommée «online» doit avoir un getter nommé «getOnline».
Par conséquent, avoir des propriétés booléennes avec «est» dans le nom est un cas de bord, où vous voudrez supprimer ce préfixe particulier lors de votre conversion. Dans le sens inverse, votre code peut souhaiter inspecter l'objet json à la fois pour un nom de propriété brut et pour une version 'is_XXX'.
la source
Je pense que ce que tu veux est ici . En utilisant des annotations, vous pouvez dire à GSON que mySuperCoolField est en fait appelé this_field_is_fun dans le JSON et qu'il le décompressera correctement. Au moins, je pense que cela fonctionne aussi pour la désérialisation.
Si cela ne fonctionne pas, vous pouvez utiliser des JsonSerializer / JsonDeserializers personnalisés, qui fonctionnent très bien, mais vous devez les mettre à jour pour les changements dans votre classe (comme lorsque vous ajoutez un champ). Vous perdez l'auto-magie.
La chose la plus simple à faire (ce qui serait moche, mais très propre et simple si la première suggestion ne fonctionne pas) serait simplement de nommer le champ de manière à rendre GSON heureux, et d'ajouter des méthodes d'accesseur supplémentaires avec les noms que vous aimez , par exemple
la source