У меня есть простой класс, содержащий переменную имени типа java.lang.CharSequence
class Person {
public java.lang.CharSequence name;
}
Когда я пытаюсь десериализовать строку json с использованием библиотеки Gson
Person p;
Gson gson = new Gson();
String json = "{\"name\":\"dinesh\"}";
p = gson.fromJson(json, Person.class);
System.out.println(p);
Это дает мнеследующая ошибка: java.lang.RuntimeException: Невозможно вызвать конструктор без аргументов для интерфейса java.lang.CharSequence. Регистрация InstanceCreator в Gson для этого типа может решить эту проблему.
Как это исправить? Я не могу изменить тип Person.name на String.
Как предлагается в комментариях,
Я создал специальный адаптер для CharSequence
class CharSequenceAdapter extends TypeAdapter<CharSequence> {
@Override
public void write(JsonWriter out, CharSequence value) throws IOException {
}
@Override
public CharSequence read(JsonReader in) throws IOException {
String s = new String();
in.beginObject();
while(in.hasNext()) {
s = in.nextString();
}
return s;
}
}
, и Мой конструктор gson выглядитthis:
Person p;
GsonBuilder builder = new GsonBuilder().registerTypeAdapter(java.lang.CharSequence.class, new CharSequenceAdapter());
Gson gson = builder.create();
String json = "{\"name\":\"dinesh\"}";
p = gson.fromJson(json, Person.class);
System.out.println(p);
Теперь это дает мне еще одну ошибку: Ожидается BEGIN_OBJECT, но в строке 1 столбца 10 путь $ .name
Что я пропустил?
Я не считаю его дубликатом, все остальные вопросы говорят о десериализации одного класса / интерфейса в целом, у меня проблема с классом, в котором ссылки на интерфейсы являются переменными-членами. Не удалось решить проблему из похожих ответов.