¿Cómo serializar un map a la cadena JSON a través de JSON.stringify en kotlin JS?

Mi código de ejemplo está a continuación:

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) } 

El resultado es "{name=albert, age=26, work=[1, 2, 3]}" . Parece que omite todas las comillas dobles alnetworkingedor del nombre de la propiedad y el valor de la cadena.

Estoy usando KotlinJS lugar de Kotlin

Entonces, ¿cómo resolver esto?

En realidad, no obtienes el resultado de JSON.stringify . En cambio, obtienes el resultado de kotlin.collections.HashMap.toString . El motivo es el siguiente: pasa el lambda como un segundo parámetro: { _, value -> value.toString() } . Esto convierte su map completo en una cadena, utilizando la function toString() . Y la function HashMap.toString se define para generar dicha cadena, que no es una cadena JSON. Deberías haber usado JSON.stringify sin el segundo y tercer parámetro. Sin embargo, esto no funcionará tan bien, produciendo Uncaught TypeError: Converting circular structure to JSON error Uncaught TypeError: Converting circular structure to JSON . La razón es la siguiente: JSON.stringify no es parte del lenguaje de Kotlin, es solo una definición escrita a máquina de un object de browser nativo, llamado JSON. HashMap no es un object JavaScript vacío, permite usar cualquier tipo de object como key, expone API de Map tipo Java, que no está disponible en el object JavaScript. Entonces, HashMap no es adecuado para lo que estás haciendo. Hay varias soluciones:

  1. Puede esperar hasta que publiquemos la serilización multiplataforma de Kotlin, consulte la discusión correspondiente . Esta API es capaz de entender las classs de Kotlin y convertirlas a JSON correctamente.

  2. No use maps y lists de Kotlin, use entidades de JavaScript nativas, como json y arreglos puros. Su ejemplo puede ser reescrito de la siguiente manera:

    importar 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) }