6 votes

Pourquoi kotlin jackson ne peut pas désérialiser la liste

J'ai une fonction :

inline fun parse(result: String): T  = mapper.readValue>(result).someValue

Lorsque je passe un type de liste, par exemple List, et que j'essaie de récupérer un élément, je reçois l'exception suivante :

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

4voto

Roland Points 8368

Vous devez passer le type à la fonction readValue, sinon Jackson n'a aucun moyen de savoir vers quel type il doit se transformer. Par défaut, jackson renvoie simplement une carte avec des clés et leurs valeurs.

Donc, pour votre problème particulier, vous pouvez simplement rendre la fonction parse inline et ajouter un reified à votre type passé. Cela garantit que le type réel est également transmis à Jackson. Voir aussi les types reified dans la référence kotlin. Alternativement, vous pouvez passer le type réel (en utilisant TypeReference ou la classe elle-même si elle n'est pas générique).

Auparavant, cette réponse contenait également des informations générales sur la désérialisation d'une liste JSON en une liste réelle, que je vais laisser ici pour référence:

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

ou si vous utilisez jackson-module-kotlin:

mapper.readValue>(result)

Appliqué à votre fonction, cela pourrait ressembler à ce qui suit:

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

ou en utilisant jackson-module-kotlin:

inline fun parse(result: String): T  = mapper.readValue(result)

L'appeler serait alors simplement:

val yourObjList = parse>(yourJson)
// ou
val yourObjList : List = parse(yourJson)

Remarquez que j'ai utilisé reified (qui implique inline). Si vous n'utilisez pas reified, le type réel n'est pas transmis aux méthodes reified de jackson-module-kotlin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X