2014-01-17 5 views
0

Я хочу включить в свои объекты службы общий способ десериализации списков объектов из строки json.Deserialize json string в типично типизированный список

Ниже была моя первая попытка.

public abstract class AbstractService<T>{ 

    public abstract Class<T> getClazz(); 

    public List<T> deserialize(final String json){ 
     Gson gson = gsonFactory.create(); 
     Type listType = new TypeToken<List<T>>() {}.getType(); 
     List<T> entityList = gson.fromJson(json, listType); 
     return entityList; 
    } 
} 

Однако из-за типа стирания, Т в: new TypeToken<List<T>>() {}.getType(); не доступен во время выполнения. Поэтому вместо того, чтобы вернуть список моих объектов, Gson возвращает список объектов Gson Map.

ПРИМЕЧАНИЕ. У меня есть доступ во время выполнения к конкретному классу T, вызвав getClazz(). Хотя я не уверен, как я могу использовать это, чтобы дать указание Гсону отправить мне список определенного типа.

Кто-нибудь знает способ заставить это работать?

Любая помощь будет оценена по достоинству.

+0

Может передать параметр? –

ответ

0

Работал.

Согласно gson docs here, вам необходимо разделить строку на отдельные элементы и десериализовать их отдельно.

«Использовать API-анализатор Gson (низкоуровневый потоковый анализатор или DOM-парсер JsonParser) для анализа элементов массива, а затем использовать Gson.fromJson() для каждого из элементов массива. Это предпочтительный подход. example, который демонстрирует, как это сделать ».

Так что мое решение будет:

public abstract class AbstractService<T>{ 

    public abstract Class<T> getClazz(); 

    public List<T> deserialize(final String json){ 
     JsonArray array = parser.parse(json).getAsJsonArray(); 
     final List<T> entityList = new ArrayList<V>(); 
     for(final JsonElement jsonElement: array){ 
      T entity = gson.fromJson(jsonElement, getClazz()); 
      entityList.add(entity); 
     } 
     return entityList; 
    } 
} 
Смежные вопросы