Convertir les noms de propriétés de style JSON en noms Java CamelCase avec GSON

J’utilise GSON pour convertir les données JSON que je reçois sur un object Java. Cela fonctionne plutôt bien dans tous mes tests. Le problème est que nos objects réels ont des propriétés nommées comme is_online. GSON ne les mappe que s’ils sont nommés totalement égaux, il serait intéressant 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, le cas camel est converti pour souligner les mots séparés dans JSON. Mais je ne peux pas trouver un moyen de spécifier ceci dans l’autre sens.

J’ai trouvé le réglage suivant parfait pour lire json avec des atsortingbuts soulignés et utiliser camelcasing dans mes modèles.

Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create() 

Vous pouvez utiliser l’annotation SerializedName :

 @SerializedName("field_name_in_json") private final Ssortingng fieldNameInJava; 

Remarque: Lorsque vous avez déjà défini FieldNamingPolicy , SerializedName remplacera ses parameters pour ce champ spécifique (très pratique pour les cas particuliers).

Gardez à l’esprit que votre exemple est une affaire de bord. Si vous avez une propriété ‘foo’, son getter devrait s’appeler ‘getFoo’, et si vous avez une propriété nommée ‘foo_bar’, son getter devrait s’appeler ‘getFooBar’. conventions de dénomination des cas spéciaux en Java. Une propriété booléenne primitive nommée online doit avoir un getter nommé ‘isOnline’, PAS ‘getOnline’ ou, pire encore, ‘getIsOnline’. Un object booléen (c.-à-d. Booléen) ne devrait pas suivre ce cas particulier et une propriété nommée ‘en ligne’ devrait avoir un getter nommé ‘getOnline’.

Par conséquent, avoir des propriétés booléennes avec «is» dans le nom est une casse, où vous voudrez supprimer ce préfixe particulier lors de votre conversion. En sens inverse, votre code peut vouloir inspecter l’object json à la fois pour un nom de propriété brut et pour une version “is_XXX”.

Je pense que ce que vous voulez est ici . En utilisant les annotations, vous pouvez dire à GSON que mySuperCoolField s’appelle réellement 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 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 (qui serait moche, mais très propre et simple si la première suggestion ne fonctionne pas) serait de nommer simplement le champ de manière à rendre GSON heureux, et d’append des méthodes d’accesseur supplémentaires avec les noms que vous aimez , par exemple

 public boolean isXXX() {return this.is_XXX;}