2010-03-03 8 views
72

J'utilise GSON pour convertir les données JSON que j'obtiens dans 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 sympa d'avoir GSON convertir les noms en Java camel case isOnline.Conversion des noms de propriétés de style JSON en noms Java CamelCase avec GSON

Il semble que cela soit possible lors de la création des données JSON, le cas de chameau est converti pour souligner les mots séparés dans JSON. Mais je ne peux pas trouver un moyen de spécifier cela dans l'autre sens.

+3

Je proposerais d'accepter une réponse – JeanValjean

Répondre

2

Gardez à l'esprit que votre exemple est un cas de bordure. 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', cependant, dans votre exemple vous mappez un booléen et les booléens ont conventions de nommage de cas spéciaux en Java. Une propriété booléenne primitive nommée online devrait avoir un getter nommé 'isOnline', pas 'getOnline' ou pire, 'getIsOnline'. Un objet wrapper booléen (c'est-à-dire booléen) 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 'is' dans le nom est un cas de contour, où vous voudrez supprimer ce préfixe particulier pendant votre conversion. Dans le sens inverse, votre code peut vouloir inspecter l'objet json à la fois pour un nom de propriété brut et une version 'is_XXX'.

2

Je pense que ce que vous voulez est here. En utilisant des annotations, vous pouvez dire à GSON que le champ mySuperCoolField est appelé this_field_is_fun dans le JSON et qu'il le décompactera correctement. Au moins, je pense que cela fonctionne aussi pour la désérialisation. Si cela ne fonctionne pas, vous pouvez utiliser JsonSerializer/JsonDeserializers, qui fonctionnent 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 meilleure chose à faire (ce qui serait laid, mais très propre et simple si la première suggestion ne fonctionne pas) serait de simplement nommer le champ de façon à rendre GSON heureux, et d'ajouter des méthodes d'accesseur supplémentaires avec les noms que vous aimez, par exemple

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

la chose la plus facile est ce que je fais en ce moment et cela fonctionne très bien. Tout le code java laid non typé est caché dans les classes de données et personne de l'extérieur ne le verra. Mais il me harcèle encore un peu :) – Janusz

206

J'ai trouvé le paramètre suivant fonctionne parfaitement lors de la lecture JSON avec des attributs et soulignés en utilisant la notationCamel dans mes modèles.

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

Cela devrait être une réponse acceptée. –

+2

Bonne réponse, merci! @janusz, si l'une de ces réponses vous a aidé, veuillez les marquer comme réponse acceptée. – sufinawaz

+1

Si vous avez un cas où le nom contient deux traits de soulignement, il ignore le premier trait de soulignement. Ex. this_key_has__two_underscores sera converti en thisKeyHas_TwoUnderscores et le même vice versa. Le point clé est le FieldNamingPolicy où l'enum dit "en minuscules" avec des underscores alors qu'ici le nom converti a une majuscule avec un trait de soulignement (_T). –

62

Vous pouvez utiliser l'annotation SerializedName:

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

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

Questions connexes