Isso está relacionado a uma pergunta anterior que fiz aqui anteriormente
Estou tentando analisar o mesmo JSON, mas agora mudei um pouco minhas classes.
{
"lower": 20,
"upper": 40,
"delimiter": " ",
"scope": ["${title}"]
}
Minha classe agora se parece com:
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 lança uma exceção,
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
A exceção é compreensível, porque de acordo com a solução da minha pergunta anterior, GSON espera que os objetos Enum sejam realmente criados como
${title}("${title}"),
${description}("${description}");
Mas, uma vez que isso é sintaticamente impossível, quais são as soluções recomendadas e soluções alternativas?
"1"
, por exemplo, em vez de simplesmente1
...SerializedName
, o enum será padronizado comonull
. O comportamento padrão de estado desconhecido pode ser tratado em uma classe de wrapper. No entanto, se você precisar de uma representação para "desconhecido"null
, será necessário escrever um desserializador personalizado ou adaptador de tipo.Use anotação
@SerializedName
:fonte
Com GSON versão 2.2.2 enum será empacotado e descompactado facilmente.
fonte
O trecho a seguir remove a necessidade de explícito
Gson.registerTypeAdapter(...)
, usando a@JsonAdapter(class)
anotação, disponível desde Gson 2.3 (consulte o comentário pm_labs ).fonte
Se você realmente deseja usar o valor ordinal do Enum, pode registrar um tipo de adaptador de fábrica para substituir o padrão de fábrica do Gson.
Depois é só registrar a fábrica.
fonte
use este método
fonte