Потерпи мой английский. У меня простой json,
{
"Hint2": "L"
}
это POJO, который работает.
public class Hints {
@SerializedName("Hint2")
@Expose
private String Hint2;
public void setHint1(Object Hint2) {
this.Hint2 = (Hint2);
}
}
я хочу изменить это на
public class Hints {
@SerializedName("Hint2")
@Expose
public final ObservableField<String> Hint2 = new ObservableField<>();
public void setHint2(String Hint2) {
this.Hint2.set(Hint2);
}
}
оба класса имеют один и тот же метод установки, один и тот же тег аннотации @SerializedName. изменяется только тип объекта Hint2. но последний выдает исключение, показанное ниже
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at..
поэтому я считаю, что десериализация зависит от типа переменной «Hint2».
Есть ли способ заставить его работать с ObservableField вместо использования String?
Причина, по которой я пытаюсь это сделать, - это библиотека привязки Android, которая поддерживает привязку объектов непосредственно к файлам xml. а ObservableField автоматически обновляет пользовательский интерфейс при изменении соответствующего значения в POJO.
Обновление:
дизайн gson документ имеет это
Использование полей и геттеров для обозначения элементов Json
Некоторые библиотеки Json используют геттеры типа для вывода элементов Json. Мы решили использовать все поля (вверх по иерархии наследования), которые не являются временными, статическими или синтетическими. Мы сделали это, потому что не все классы написаны с подходящими именами геттеров. Более того, getXXX или isXXX могут быть семантическими, а не указывать свойства.
Однако есть и веские аргументы в пользу поддержки свойств. Мы намерены улучшить Gson в последней версии для поддержки свойств в качестве альтернативного сопоставления для указания полей Json. На данный момент Gson основан на полях.
это означает, что Gson основан на полях. это в значительной степени отвечает на мой вопрос, но все еще жду, если у кого-то есть способ обойти это.