LINUX.ORG.RU

Как gson парсит листы?

 ,


0

3
String values  = "[some json array]"
Foo foo = new Foo();
foo.setValues(new Gson().fromJson(values, new TypeToken<List<Bar>>() {}.getType()));

Как он понимает что лист надо заполнить Bar'ами если generic'и после компиляции превращаются в Object ? И почему не работает такая конструкция?

  foo.setValues(readJsonField(values));

  public static <T> T readJsonField(String field) {
        if (field == null) {
            return null;
        }
        return (T) new Gson().fromJson(field, new TypeToken<T>() {}.getType());
    }


Как он понимает что лист надо заполнить Bar'ами если generic'и после компиляции превращаются в Object ?

Generic-и после компиляции не всегда превращаются в Object.

В этой строчке:

new TypeToken<List<Bar>>() {}.getType())
Определяется новый анонимный класс, который наследуется от класса list параметризованного типом Bar. Создаётся объект этого класса, который может получить доступ к информации о своём классе.

И почему не работает такая конструкция?

Потому что в этой конструкции как раз таки теряется информация о Generic-ах.

Legioner ★★★★★
()
Ответ на: комментарий от kote

Как вариант

  readJsonField(foo::setValues, values);

  public static <T> void readJsonField(Consumer<T> consumer, String field) {
        if (field == null) {
            return;
        }
// а тут из consumer вытаскиваешь тип принимаемого 
// аргумента и по нему раскручиваешь что десериализовать
       consumer.accept(deserilizedValue);
    }

Но надо курить что там с этими новомодными функцоальными интерфейсами, и останется ли там хоть какято инфа о типах

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.