2012-02-13 2 views
3

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

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

Я уже посмотрел на некоторые подобные вопросы здесь, как: Using a generic type with Gson, но я не нашел решение, что на самом деле работает.

ответ

3

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

Если вы можете получить объект класса для Т прошли в как-то во время выполнения, то вы можете попробовать решение я предложил в How do I build a Java type object at runtime from a generic type definition and runtime type parameters?

0

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

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

2

он оказался на самом деле проще, чем большинство людей думали:

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

Не нужно копировать класс ParameterizedTypeImpl как newacct, предложенный в его ответе.