gpt4 book ai didi

带有 Kotlin 嵌套类的 Gson

转载 作者:行者123 更新时间:2023-12-04 19:30:03 26 4
gpt4 key购买 nike

我无法使用 Gson 将嵌套的 Kotlin 类正确反序列化为正确的类型。
当我尝试反序列化同一个 Java 类时,它工作正常。

Java类:

package example;

import java.util.List;
import java.util.Map;

class TestJsonJava {
Map<String, List<Entry>> outer;

static class Entry {
String inner;
}
}

Kotlin 类:
package example

class TestJsonKotlin {
var outer: Map<String, List<Entry>>? = null

class Entry {
var inner: String? = null
}
}

Kotlin 主要:
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)
}
}
}

这打印:
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)

我如何告诉 gson 反序列化 keyA 的值到 List<Entry>而不是 LinkedTreeMap ?

最佳答案

注释 List@JvmSuppressWildcards似乎有帮助:

var outer: Map<String, @JvmSuppressWildcards List<Entry>>? = null

如果我们不使用 @JvmSuppressWildcards ,那么 Kotlin 代码被翻译成:
Map<String, ? extends List<TestJsonKotlin.Entry>> outer;

如果我们确实使用它,那么代码将被转换为:
Map<String, List<TestJsonKotlin.Entry>> outer;

区别在于通配符 ? extends – 即使您用 Java 编写,也不支持此功能。我在 Gson 的存储库中提交了一个问题 here .
javap突出了两种情况之间的区别:
// `TestJsonKotlin` with `val outer` is compiled to
public final class TestJsonKotlin {
private final java.util.Map<java.lang.String, java.util.List<TestJsonKotlin$Entry>> outer;
public final java.util.Map<java.lang.String, java.util.List<TestJsonKotlin$Entry>> getOuter();
// ...
}

// `TestJsonKotlin` with `var outer` is compiled to
public final class TestJsonKotlin {
private java.util.Map<java.lang.String, ? extends java.util.List<TestJsonKotlin$Entry>> outer;
public final java.util.Map<java.lang.String, java.util.List<TestJsonKotlin$Entry>> getOuter();
// ...
}
var案例添加 ? extends前面 java.util.List<TestJsonKotlin$Entry> .

关于带有 Kotlin 嵌套类的 Gson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44472365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com