Gson: разобрать родовые коллекции - PullRequest
3 голосов
/ 13 февраля 2012

Можно ли создать метод, который анализирует обобщенную коллекцию из jsson? Мой вышеприведенный подход не работает, потому что во время выполнения gson возвращает ArrayList LinkedHasmaps, однако во время компиляции ошибок нет.

private <T> ArrayList<T> readArray(String json)
{
    Gson gson = new Gson();
    Type collType = new TypeToken<ArrayList<T>>() {
    }.getType();
    return gson.fromJson(json, collType);
}

Я уже рассматривал некоторые подобные вопросы, например: Использование универсального типа с Gson , но я не нашел решения, которое действительно работает.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

Материал TypeToken требует, чтобы параметры типа были зафиксированы во время компиляции. Как ArrayList<String> или что-то. ArrayList<T> не будет работать.

Если вы можете получить объект класса для T, каким-либо образом переданный во время выполнения, тогда вы можете попробовать решение, которое я предложил в Как мне построить объект типа Java во время выполнения из определения общего типа и параметров типа времени выполнения?

2 голосов
/ 06 февраля 2013

Это оказалось действительно проще, чем думали многие:

Type collectionType = new TypeToken<ArrayList<Person>>(){}.getType();
ArrayList<Person> persons = gson.fromJson(response, collectionType);

Нет необходимости копировать класс ParameterizedTypeImpl, как предлагал newacct в своем ответе.

0 голосов
/ 13 февраля 2012

По умолчанию, в v2.1, если вы ничего не делаете, он будет десериализован в List<Map<String,Object>>

Вы можете зарегистрировать TypeAdapterFactory для этого типа Коллекции и затем определить, к какому типу объектов это должно быть фактически десериализовано.

...