Je n'arrive pas à désérialiser correctement une classe Kotlin imbriquée comme le type correct avec Gson. Lorsque j'essaie de désérialiser la même classe Java, cela fonctionne correctement.Gson avec la classe imbriquée par Kotlin
classe Java:
package example;
import java.util.List;
import java.util.Map;
class TestJsonJava {
Map<String, List<Entry>> outer;
static class Entry {
String inner;
}
}
classe Kotlin:
package example
class TestJsonKotlin {
var outer: Map<String, List<Entry>>? = null
class Entry {
var inner: String? = null
}
}
Kotlin principale:
package example
import com.google.gson.GsonBuilder
class Main {
companion object {
@JvmStatic
fun main(args: Array<String>) {
val json = """
{
"outer": {
"keyA": [
{
"inner": "hello"
}
]
}
}
"""
val javaObject = GsonBuilder().create().fromJson(json, TestJsonJava::class.java)
val javaWorks = javaObject.outer!!["keyA"]!![0] is TestJsonJava.Entry
println("Java works : $javaWorks")
println(javaObject.outer!!["keyA"]!![0].inner)
val kotlinObject = GsonBuilder().create().fromJson(json, TestJsonKotlin::class.java)
val kotlinWorks = kotlinObject.outer!!["keyA"]!![0] is TestJsonKotlin.Entry
println("Kotlin works: $kotlinWorks")
println(kotlinObject.outer!!["keyA"]!![0].inner)
}
}
}
Cette impression:
Java works : true
hello
Kotlin works: false
Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to example.TestJsonKotlin$Entry
at example.Main$Companion.main(TestJsonmain.kt:28)
at example.Main.main(TestJsonmain.kt)
Comment puis-je dire à gson de désérialiser la valeur de keyA
en List<Entry>
au lieu de LinkedTreeMap
?
J'ai remarqué [vous criez beaucoup au compilateur.] (Https://blog.philipphauer.de/idiomatic-kotlin-best-practices/#avoid-not-null-assertions) Je suppose que cette utilisation de '!! 'est juste pour MCVE fins? –
Oui, c'est juste pour l'exemple pour garder les choses simples – nioncode