L'utilisation des Enums lors de l'analyse de JSON avec GSON
Cela est lié à une précédente question que j'ai posée ici plus tôt
JSON l'analyse en utilisant Gson
Je suis en train d'analyser le même JSON, mais maintenant, j'ai changé mes classes un peu.
{
"lower": 20,
"upper": 40,
"delimiter": " ",
"scope": ["${title}"]
}
Ma classe ressemble maintenant à:
public class TruncateElement {
private int lower;
private int upper;
private String delimiter;
private List<AttributeScope> scope;
//getters and setters
}
public enum AttributeScope {
TITLE("${title}"),
DESCRIPTION("${description}"),
private String scope;
AttributeScope(String scope) {
this.scope = scope;
}
public String getScope() {
return this.scope;
}
}
Ce code génère une exception,
com.google.gson.JsonParseException: The JsonDeserializer EnumTypeAdapter failed to deserialized json object "${title}" given the type class com.amazon.seo.attribute.template.parse.data.AttributeScope
at
L'exception est compréhensible, parce que par la solution à ma question précédente, GSON attend l'énumération des objets à être créé en tant que
${title}("${title}"),
${description}("${description}");
Mais puisque c'est impossible du point de vue syntaxique, quelles sont les solutions recommandées, des solutions de contournement?
Vous devez vous connecter pour publier un commentaire.
De la documentation de Gson:
Qui suit est une telle approche.
Je veux développer un peu plus NAZIK/user2724653 réponse (pour mon cas). Voici un code Java:
dans le fichier json vous avez juste un champ
"status": "N",
, où N=0,1,2,3 - de s'appuyer sur les valeurs de Statut. Donc, c'est tout,GSON
fonctionne très bien avec les valeurs de la imbriquéeenum
classe. Dans mon cas, j'ai analysé une liste deItems
dejson
tableau:"1"
, par exemple, au lieu de simplement1
...SerializedName
puis l'enum par défautnull
. Comportement par défaut de l'inconnu de l'état pourraient être traitées dans une classe wrapper. Si vous avez toutefois besoin d'une représentation de "inconnu" autres quenull
alors vous aurez besoin d'écrire une coutume deserializer ou le type de carte.Utiliser les annotations
@SerializedName
:Avec GSON version 2.2.2 enum sera maintenue en ordre et unmarshalled facilement.
L'extrait de code suivant supprime le besoin explicite
Gson.registerTypeAdapter(...)
, à l'aide de la@JsonAdapter(class)
annotation, disponible depuis Gson 2.3 (voir le commentaire pm_labs).Si vous voulez vraiment utiliser les Enum valeur ordinale vous pouvez enregistrer un type de carte à l'usine pour remplacer Gson par défaut de l'usine.
Ensuite, il suffit de s'inscrire à l'usine.
utiliser cette méthode