2016-09-20 2 views
0

Я использую Jackson-jr для чтения своих файлов JSON. Одним из них является немного сложным:Jackson-jr read polymorphic ArrayList

[ 
{"test-1":["a","b","c","d"]}, 
{"test-2":["b","j","d"]}, 
{"test-3":["n","e","o","p","i"]}, 
{"test-4":["s","a","v","z","b","ç","x","p"]}, 
{"test-5":["d","q","u"]}, 
{"test-6":["f","b"]} 
] 

Мой код для чтения очень просто:

InputStream inputStream = assetManager.open("test.json"); 
ArrayList<HashMap<String, ArrayList<String>>> arrays = JSON.std.beanFrom(ArrayList.class, inputStream); 

Мое намерение состоит в том, чтобы каждый массив для работы с каждым из них:

arrays.get(i); 

Но, когда эта линия выполнена, у меня есть Исключение:

Caused by: java.lang.ClassCastException: com.fasterxml.jackson.jr.ob.impl.DeferredMap cannot be cast to java.util.HashMap 

У Jackson-jr нет TypeFactory, TypeReference или ObjectMapper. Некоторые ссылки, которые я нашел ответы на Джексоне, а не для ДЖЕКСОН-Jr:

ClassCastException when convert json to list of objects

Jackson custom deserializer for one field with polymorphic types

Tricky(?) JSON, polymorphic deserialization

Существует ли сказать, справиться с этим в Джексон-младший?

+1

Определить 'arrays' как' List >> arrays' – sidgate

+0

Вы экономите день. Благодарю. – learner

ответ

0

Вы должны запрограммировать интерфейс, а не классы реализации. Поскольку вернувшаяся реализация карты DeferredMap, а не HashMap, вы получаете ClassCastException. Изменение назначения, как показано ниже

List<Map<String, List<String>>> arrays = JSON.std.beanFrom(ArrayList.class, inputStream); 
+0

Кроме того, вместо 'beanFrom', метод для использования должен, скорее всего, быть' listOfFrom', в результате получается 'List', а не Bean. Если это так, введите «Map.class». – StaxMan

+0

Изменение исходного кода на основе наблюдений. – learner