Десериализовать класс, содержащий переменную-член java.lang.CharSequence - PullRequest
0 голосов
/ 19 октября 2019

У меня есть простой класс, содержащий переменную имени типа 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

Что я пропустил?

Я не считаю его дубликатом, все остальные вопросы говорят о десериализации одного класса / интерфейса в целом, у меня проблема с классом, в котором ссылки на интерфейсы являются переменными-членами. Не удалось решить проблему из похожих ответов.

1 Ответ

1 голос
/ 19 октября 2019

CharSequence - это интерфейс.

Когда Gson пытается десериализовать строку json в объект, он «анализирует» объект (используя отражение) и пытается разрешить типы полей. Затем он пытается создать поле того времени.

Из коробки Gson может работать со многими «широко распространенными» типами, такими как String, Integer, Boolean и т. Д., Однако, когда GSon этого не знает (Как и в этом случае CharSequence), GSon останавливается с ошибкой.

Теперь ясно, что вы должны «научить» Gson понимать этот пользовательский тип. Для этого в Gson есть адаптеры типа.

Здесь вы можете найти краткое руководство по использованию адаптеров. Я не буду здесь переписывать пример, но в общем случае вы должны создать адаптер, зарегистрировать его на объекте Gson и вызвать свой код. Когда Gson достигает поля CharSequence, он находит этот пользовательский адаптер и вызывает его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...