2017-02-07 6 views
0

У меня есть коллекция классов, таких, как это:Анализировать список динамических классов в gson андроида

entityClasses = new HashMap<String, Class>(); 
    entityClasses.put("EntityType1", EntityType1.class); 
    entityClasses.put("EntityType2", EntityType2.class); 

У меня также есть список JSON своих экземпляров, а также:

String entityJSON = "[{"type":"EntityType1","name":"... attributes"},...]"; 

Где Атрибут типа определяет класс объекта, который станет объектом анализа JSON. Как я могу разобрать их с помощью gson?

Я попытался следующим:

String type = "EntityType1"; // I already can fetch this. 
final Class entityClass = entityClasses.get(type); 
new Gson().fromJson(entityJSON, new TypeToken<ArrayList<entityClass>>(){}.getType()); 

Какой будет работать, если entityClass было фактическое имя класса, а не переменная, которая представляет класс. В моем случае, однако, я получаю следующее сообщение об ошибке: Неизвестного класса: «entityClass»

Так как можно разобрать с помощью переменного класса?

Заранее благодарен!

+0

Как насчет вы получите тип пункт JSON вручную, а затем провести остаток JSON в Gson? –

+0

Извините, моя ошибка. Это то, что я на самом деле делаю. Ответ был исправлен. – user3156850

+0

Это не то, как должны работать токены типа. 'TypeToken' должен объявлять параметры своего типа во время компиляции, и вы не можете их заменить во время выполнения. Просто создайте сопоставление типа «Map >» и опишите каждый токен типа, как новый 'новый TypeToken <Список >() {}'. –

ответ

0

В общем, вы не можете этого сделать, так как вы должны передать класс как общий тип: не List<String.class>, а List<String>.

Но вы можете использовать обходной путь, как это: список магазинов TypeToken «ы вместо списка родовых типов:

entityClasses = new HashMap<String, TypeToken>(); 
entityClasses.put("EntityType1", new TypeToken<ArrayList<EntityType1>>(){}); 

... 
String type = "EntityType1"; // I already can fetch this. 
final TypeToken typeToken= entityClasses.get(type); 
new Gson().fromJson(entityJSON, typeToken.getType()); 
+0

Спасибо, спасибо всем за помощь! – user3156850