Это связано с предыдущим вопросом, который я задавал здесь ранее
Разбор JSON с использованием Gson
Я пытаюсь разобрать тот же JSON, но теперь я немного изменил свои классы.
{
"lower": 20,
"upper": 40,
"delimiter": " ",
"scope": ["${title}"]
}
Мой класс теперь выглядит так:
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;
}
}
Этот код выдает исключение,
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
Исключение понятно, потому что в соответствии с решением моего предыдущего вопроса GSON ожидает, что объекты Enum будут фактически созданы как
${title}("${title}"),
${description}("${description}");
Но поскольку это синтаксически невозможно, каковы рекомендуемые решения и обходные пути?
"1"
, например, вместо того, чтобы просто1
...SerializedName
то по умолчанию будет указано перечислениеnull
. Поведение по умолчанию неизвестного состояния может быть обработано в классе-оболочке. Однако, если вам нужно представление для «unknown», кромеnull
этого, вам нужно будет написать собственный десериализатор или адаптер типа.Используйте аннотацию
@SerializedName
:источник
В GSON версии 2.2.2 перечисление будет легко маршалироваться и демаршалироваться.
источник
Следующий фрагмент устраняет необходимость в явном
Gson.registerTypeAdapter(...)
использовании@JsonAdapter(class)
аннотации, доступной с Gson 2.3 (см. Комментарий pm_labs ).источник
Если вы действительно хотите использовать порядковое значение Enum, вы можете зарегистрировать фабрику адаптеров типов, чтобы переопределить фабрику Gson по умолчанию.
Тогда просто зарегистрируйте завод.
источник
используйте этот метод
источник