Я использую 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