如何通过JSON.stringify在kotlin JS序列化一个地图到JSON字符串?

我的示例代码如下:

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结果。 原因如下:您将lambda作为第二个参数传递: { _, value -> value.toString() } 。 这将使用toString()函数将整个映射转换为字符串。 而HashMap.toString函数被定义为生成这样的字符串,它不是 JSON字符串。 你应该使用没有第二和第三个参数的JSON.stringify 。 但是,这不会工作,产生Uncaught TypeError: Converting circular structure to JSON错误。 原因如下: JSON.stringify不是Kotlin语言的一部分,它只是一个本地浏览器对象的类型化定义 ,称为JSON。 HashMap不是一个空的JavaScript对象,它允许使用任何类型的对象作为键,它暴露了JavaScript对象中不可用的类Java Map API。 所以, HashMap不适合你在做什么。 有几个解决方案:

  1. 您可以等到我们发布Kotlin多平台的时候,看到相应的讨论 。 这个API能够理解Kotlin类并将它们转换为JSON。

  2. 不要使用Kotlin地图和列表,使用本地JavaScript实体,比如json和纯数组。 你的例子可以用下面的方法重写:

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