2017-06-23 149 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