我在 javascript 平台上使用 kotlin。此代码在第六行失败,出现异常“Uncaught TypeError: a.c.iterator is not a function”。
class A(val b: String, val c: List<String>)
fun main(args: Array<String>) {
val a = JSON.parse<A>("""{"b": "b_value", "c": ["c_value_1", "c_value_2"]}""")
println(a.b)
for (c in a.c) println(c)
}
在 javascript 调试器中,我可以看到,该对象“a”已反序列化。但我认为,它不是 A 类型的有效 kotlin 对象。无论如何,如何从对象“a”或原始 json 字符串创建 A 类型的有效 kotlin 对象实例?
最佳答案
你不应该使用 JSON.parse
与常规的 Kotlin 类(class)。将其与外部接口(interface)一起使用,即:
external interface A(val b: String, val c: Array<String>)
fun main(args: Array<String>) {
val a = JSON.parse<A>("""{"b": "b_value", "c": ["c_value_1", "c_value_2"]}""")
println(a.b)
for (c in a.c) println(c)
}
抱歉,这种限制无法通过 Kotlin 类型系统表达。
是的,正如@marstran 提到的,你不应该使用 List<T>
在这种情况下,还有其他 Kotlin 集合。我们正在开发一个库,用于将 JSON 反序列化为 Kotlin JS 类(类似于 JVM 中的 Jackson),但我还不能透露时间范围。
UPD:有kotlinx.serialization将 Kotlin 类与 JSON 进行映射的库。
关于javascript - Kotlin JS JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715920/