如何通过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
不适合你在做什么。 有几个解决方案:
-
您可以等到我们发布Kotlin多平台的时候,看到相应的讨论 。 这个API能够理解Kotlin类并将它们转换为JSON。
-
不要使用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) }
- Kotlin转换为Javascript错误:“减法不是函数”
- 像在Java中那样扩展TextInput以在React Native中自定义默认字体和文本颜色
- Kotlin和Firebase云function的update()方法
- ReferenceError:ok没有在Kotlin Javascript的QUnitAsserter.assertTrue中定义
- 如何在Kotlin中使用一个叫做“val()”的函数? /扩展外部JS类
- Android WebView跳转到每个页面上的更新(?)
- 在Eclipse Maven项目中使用Kotlin Javascript进行DOM操作
- 将kotlin代码编译为JVM和JavaScript
- Swift to JavaScript transpiler – 可能吗?