Мой примерный код приведен ниже:
fun main(args: Array<String>) { val testData = mapOf<String, Any>( "name" to "albert", "age" to 26, "work" to listOf("1", "2", "3") ) var value = JSON.stringify(testData, { _, value -> value.toString() }, 2) println(value) }
Результатом является "{name=albert, age=26, work=[1, 2, 3]}"
. Кажется, он пропускает все двойные кавычки вокруг имени свойства и строкового значения.
Я использую KotlinJS
а не Kotlin
Итак, как это решить?
На самом деле, вы не получаете результат JSON.stringify
. Вместо этого вы получаете результат kotlin.collections.HashMap.toString
. Причина следующая: вы передаете лямбду в качестве второго параметра: { _, value -> value.toString() }
. Это преобразует всю вашу карту в строку, используя функцию toString()
. И функция HashMap.toString
определена для создания такой строки, которая не является строкой JSON. Вы должны использовать JSON.stringify
без второго и третьего параметров. Однако это не сработает, создавая Uncaught TypeError: Converting circular structure to JSON
ошибку Uncaught TypeError: Converting circular structure to JSON
. Причина в следующем: JSON.stringify
не является частью языка Kotlin, это всего лишь типизированное определение собственного объекта браузера, называемого JSON. HashMap
– это не пустой объект JavaScript, он позволяет использовать любые типы объектов в качестве ключей, он предоставляет Java-подобный API Map
, который недоступен в объекте JavaScript. Итак, HashMap
не подходит для того, что вы делаете. Существует несколько решений:
Вы можете подождать, пока мы опубликуем многоплатформенную серизацию Kotlin, см. Соответствующее обсуждение . Этот API способен понимать кланы Kotlin и правильно преобразовывать их в JSON.
Не используйте карты и списки Kotlin, используйте собственные JavaScript-объекты, такие как json и pure array. Ваш пример можно переписать следующим образом:
Импорт kotlin.js.json
fun main(args: Array<String>) { val testData = json( "name" to "albert", "age" to 26, "work" to arrayOf("1", "2", "3") ) var value = JSON.stringify(testData) println(value) }