我的示例代码如下:
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
那么,如何解决这个问题呢?
4条答案
按热度按时间flvtvl501#
实际上,您没有得到
JSON.stringify
的结果,而是得到了kotlin.collections.HashMap.toString
的结果,原因如下:把lambda作为第二个参数传递:{ _, value -> value.toString() }
。这将使用toString()
函数将整个Map转换为字符串。并且HashMap.toString
函数被定义为生成这样的字符串,该字符串不是JSON字符串。您应该使用没有第二个和第三个参数的JSON.stringify
。但是,这样做效果不佳,产生Uncaught TypeError: Converting circular structure to JSON
错误。原因如下:JSON.stringify
不是Kotlin语言的一部分,它只是一个本地浏览器对象的typed definition,称为JSON。HashMap
不是一个空的JavaScript对象,它允许使用任何类型的对象作为键,它暴露了类似Java的Map
API,这在JavaScript对象中是不可用的。因此,HashMap
不适合你所做的事情。有几个解决方案:1.你可以等到我们发布Kotlin多平台系列化,参见the corresponding discussion。这个API能够理解Kotlin类并将它们正确地转换成JSON。
1.不要使用KotlinMap和列表,使用原生JavaScript实体,比如json和纯数组。
导入kotlin.js.json
63lcw9qa2#
这个答案是在之前被接受的答案几年后出现的,但我(刚接触Kotlin的人)遇到了同样的问题,并想出了一个很好的方法来实现这一点。
1.假设您有一个已填充的Map
1.创建一个空的js对象(对我来说似乎有点笨拙,但这是Kotlin到JS)
1.迭代Map的“toList”方法,该方法提供一个Pair
1.将每一对插入js对象
1.获取js JSON API
1.并调用“stringify”来提供js对象。记住在末尾使用“toString
fdbelqdn3#
如果您只想从Kotlin
Map
中检索有效的JSON字符串,可以使用kotlinx.serialization.json
:如果你想对Kotlin
Map
进行漂亮的字符串化,它可以在<pre>
标签中显示为漂亮的JSON,你可以这样做:1.使用Kotlin序列化将Map序列化为JSON字符串
1.将JSON字符串解析为Javascript对象
1.漂亮的字符串化Javascript对象
jecbmhm34#
对于最新版本的kotlinx-serialization,请使用
encodeToDynamic
:结果是一个包含JSON对象的动态。这种方法有一些限制-例如,所有Map键必须是原语或枚举,并且
Long
值有一个最大值。有关详细信息,请参阅docs。