Как сериализовать карту в строку JSON через JSON.stringify в kotlin JS?

Мой примерный код приведен ниже:

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 не подходит для того, что вы делаете. Существует несколько решений:

  1. Вы можете подождать, пока мы опубликуем многоплатформенную серизацию Kotlin, см. Соответствующее обсуждение . Этот API способен понимать кланы Kotlin и правильно преобразовывать их в JSON.

  2. Не используйте карты и списки 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) }