2017-06-23 101 views
1

我在javascript平台上使用kotlin。此代码在第六行上失败,例外情况为“Uncaught TypeError:a.c.iterator不是函数”。Kotlin JS JSON反序列化

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 debuger中,我可以看到,该对象“a”被反序列化。但我认为,它不是一个有效的类型A的kotlin对象。有什么办法,如何从对象“a”或从原始json字符串创建类型A的有效kotlin对象实例?

回答

4

你不应该定期科特林类使用JSON.parse。改为使用外部接口,例如:

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),但我还无法对这个时间段进行任何说明。

+0

我在应用程序的服务器(jvm)部分使用相同的类。所以我不能使用外部接口。我使用了类A(val b:String,val c:Array ),它也在工作。数组而不是列表很重要。 – user3706629

+0

对不起,但目前它是Kotlin JS的限制。您必须使用外部接口来复制服务器端DTO类。 –

0

JSON.parse函数映射到本地JavaScript函数JSON.parse。此功能不知道Kotlin的List接口,所以它不会有iterator-方法。该列表仅被解析为标准的Javascript数组。

你可以把它写这方面的工作:

for (c in listOf(a.c)) println(c) 
+0

预览这是为什么工作? –

+0

我的例子很糟糕。它仅创建一个元素的列表。你应该在你的班级而不是'List'中使用'Array'。这对我来说效果更好。 – marstran