Почему Котлин Джексон не может десериализовать список - PullRequest
0 голосов
/ 31 августа 2018

У меня есть функция:

inline fun <reified T : Any>parse(result: String): T  = mapper.readValue<Response<T>>(result).someValue

Когда я передаю тип списка, например, List<MyClass> и, пытаясь получить какой-то предмет, я получаю следующее исключение:

Exception in thread "ForkJoinPool.commonPool-worker-3" 
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyClass

1 Ответ

0 голосов
/ 31 августа 2018

Вам нужно передать тип в readValue -функцию, иначе Джексон не сможет узнать, в какой тип он должен преобразовываться. По умолчанию Джексон просто возвращает карту с ключами и ее значениями.

Так что для вашей конкретной проблемы вы можете просто сделать parse - function inline и добавить reified к вашему переданному типу. Это гарантирует, что фактический тип также передается Джексону. См. Также Реализованные типы в справочнике kotlin . В качестве альтернативы вы передаете фактический тип (используя TypeReference или сам класс, если он не является универсальным).

Ранее этот ответ также содержал общую информацию о том, как десериализовать список json в реальный список, который я оставлю здесь для справки:

mapper.readValue(result, object : TypeReference<List<MyClass>>() {})

или, если вы используете jackson-module-kotlin :

mapper.readValue<List<MyClass>>(result)

Применяется к вашей функции, которая может выглядеть следующим образом:

inline fun <reified T : Any>parse(result: String): T  = mapper.readValue(result, object : TypeReference<T>() {})

или используя jackson-module-kotlin:

inline fun <reified T : Any>parse(result: String): T  = mapper.readValue(result)

Тогда его вызов будет просто:

val yourObjList = parse<List<MyClass>>(yourJson)
// or
val yourObjList : List<MyClass> = parse(yourJson)

Обратите внимание, что я использовал reified (что подразумевает inline). Если вы не используете reified, фактический тип не передается в утонченные методы Джексона-модуля-Котлина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...