Удалить дескриптор строки json в типично типизированный список

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

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

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;
 }
}
</t></list<t></t></t></t>

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

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

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

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

1 ответ

Проработал.

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

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

Поэтому мое решение становится следующим:

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;
 }
}
</v></t></t></t></t>

licensed under cc by-sa 3.0 with attribution.