Джессинская десериализация Kotlin JS

Я использую kotlin на платформе javascript. Этот код выходит из строя на шестой строке с исключением «Uncaught TypeError: aciterator не является функцией».

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(ab) for (c in ac) println(c) } 

В javascript debuger я вижу, что объект «a» десериализуется. Но я думаю, что это не действительный объект kotlin типа A. В любом случае, как создать действительный экземпляр объекта kotlin типа A из объекта «a» или из исходной строки json?

Вы не должны использовать JSON.parse с обычными классами Kotlin. Вместо этого используйте его с внешними интерфейсами, то есть:

 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(ab) for (c in ac) println(c) } 

К сожалению, такое ограничение не может быть выражено через систему типа Котлин.

И да, как упоминал @marstran, вы не должны использовать List<T> и другие коллекции Kotlin в этом случае. Мы работаем над библиотекой для десериализации JSON классов Kotlin JS (аналогично Jackson в JVM), но пока не могу сказать ничего о таймфрейме.

Функция JSON.parse сопоставляется с встроенной функцией Javascript JSON.parse . Эта функция не знает о интерфейсе List Kotlin, поэтому у него не будет метода iterator . Список просто анализируется как стандартный Javascript-массив.

Вы можете заставить его работать, написав это:

 for (c in listOf(ac)) println(c) 

Теперь для этого случая (карта JSON для класса Kotlin) вы можете использовать предварительный просмотр kotlinx.serialization