Ceci est lié à une question précédente que j'ai posée ici plus tôt
J'essaie d'analyser le même JSON, mais maintenant j'ai un peu changé mes classes.
{
"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 lève 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, car selon la solution de ma question précédente, GSON s'attend à ce que les objets Enum soient réellement créés comme
${title}("${title}"),
${description}("${description}");
Mais puisque cela est syntaxiquement impossible, quelles sont les solutions recommandées, les solutions de contournement?
"1"
, par exemple, au lieu de simplement1
...SerializedName
l'énumération sera par défautnull
. Le comportement par défaut d'un état inconnu peut être géré dans une classe wrapper. Si toutefois vous avez besoin d'une représentation pour "inconnu" autre que,null
vous devrez écrire un désérialiseur personnalisé ou un adaptateur de type.Utiliser l'annotation
@SerializedName
:la source
Avec GSON version 2.2.2, l'énumération sera facilement regroupée et démarshallée.
la source
L'extrait de code suivant supprime le besoin d'explicite
Gson.registerTypeAdapter(...)
, en utilisant l'@JsonAdapter(class)
annotation, disponible depuis Gson 2.3 (voir le commentaire pm_labs ).la source
Si vous voulez vraiment utiliser la valeur ordinale d'Enum, vous pouvez enregistrer une fabrique d'adaptateurs de type pour remplacer la fabrique par défaut de Gson.
Ensuite, enregistrez simplement l'usine.
la source
utilisez cette méthode
la source