132 votes

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 j'obtiens en un objet Java. Cela fonctionne assez 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 met en correspondance que si elles sont nommées de manière totalement égale, il 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, les majuscules étant converties en mots séparés par un trait de soulignement dans JSON. Mais je ne trouve pas de moyen de spécifier cela dans l'autre sens.

371voto

Hampei Points 378

J'ai trouvé que la configuration suivante fonctionne parfaitement lorsque je lis du json avec des attributs soulignés et que j'utilise la casse dans mes modèles.

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

113voto

saschoar Points 2433

Vous pouvez utiliser le SerializedName annotation :

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

Note : Lorsque vous avez défini un FieldNamingPolicy déjà, SerializedName remplacera ses paramètres pour ce champ spécifique (ce qui est très pratique pour les cas particuliers).

2voto

Jherico Points 12554

N'oubliez pas que votre exemple est un cas particulier. Si vous avez une propriété "foo", son getter devrait être nommé "getFoo", et si vous avez une propriété nommée "foo_bar", son getter devrait être nommé "getFooBar", cependant, dans votre exemple, vous mettez en correspondance un booléen et les booléens ont des conventions de nommage spéciales en Java. Une propriété booléenne primitive nommée online devrait avoir un getter nommé "isOnline", PAS "getOnline" ou pire, "getIsOnline". Un objet booléen enveloppant (c'est-à-dire un booléen) ne devrait pas suivre ce cas spécial et une propriété nommée "online" devrait avoir un getter nommé "getOnline".

Par conséquent, avoir des propriétés booléennes avec "is" dans le nom est un cas particulier, où vous voudrez supprimer ce préfixe particulier lors de votre conversion. Dans le sens inverse, votre code peut vouloir inspecter l'objet json à la fois pour un nom de propriété brut et pour une version 'is_XXX'.

2voto

MBCook Points 8316

Je pense que ce que vous voulez, c'est ici . En utilisant les annotations, vous pouvez dire à GSON que le champ mySuperCoolField s'appelle en fait this_field_is_fun dans le JSON et il le décompressera correctement. Du 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 la magie automatique.

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 simplement nommer le champ d'une manière qui rende GSON heureux, et d'ajouter des méthodes d'accès supplémentaires avec les noms que vous aimez, par ex.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X