Esto está relacionado con una pregunta anterior que hice aquí anteriormente.
Estoy tratando de analizar el mismo JSON, pero ahora he cambiado un poco mis clases.
{
"lower": 20,
"upper": 40,
"delimiter": " ",
"scope": ["${title}"]
}
Mi clase ahora se ve así:
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;
}
}
Este código lanza una excepción,
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
La excepción es comprensible, porque según la solución a mi pregunta anterior, GSON espera que los objetos Enum se creen realmente como
${title}("${title}"),
${description}("${description}");
Pero dado que esto es sintácticamente imposible, ¿cuáles son las soluciones recomendadas?
"1"
, por ejemplo, en lugar de simplemente1
...SerializedName
, la enumeración será predeterminadanull
. El comportamiento predeterminado de estado desconocido podría manejarse en una clase contenedora. Sin embargo, si necesita una representación para "desconocido" que no seanull
entonces, deberá escribir un deserializador personalizado o un adaptador de tipo.Utilice la anotación
@SerializedName
:fuente
Con GSON versión 2.2.2, la enumeración se calculará y eliminará fácilmente.
fuente
El siguiente fragmento elimina la necesidad de explícito
Gson.registerTypeAdapter(...)
, usando la@JsonAdapter(class)
anotación, disponible desde Gson 2.3 (ver comentario pm_labs ).fuente
Si realmente desea utilizar el valor ordinal de Enum, puede registrar una fábrica de adaptadores de tipo para anular la fábrica predeterminada de Gson.
Entonces simplemente registre la fábrica.
fuente
usa este método
fuente