如何在KotlinJS中通过JSON.stringify序列化Map to JSON字符串?

brjng4g3  于 2023-03-04  发布在  Kotlin
关注(0)|答案(4)|浏览(236)

我的示例代码如下:

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
那么,如何解决这个问题呢?

flvtvl50

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

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

63lcw9qa2#

这个答案是在之前被接受的答案几年后出现的,但我(刚接触Kotlin的人)遇到了同样的问题,并想出了一个很好的方法来实现这一点。
1.假设您有一个已填充的Map
1.创建一个空的js对象(对我来说似乎有点笨拙,但这是Kotlin到JS)
1.迭代Map的“toList”方法,该方法提供一个Pair
1.将每一对插入js对象
1.获取js JSON API
1.并调用“stringify”来提供js对象。记住在末尾使用“toString

val data: Map<String, Any?> = mapOf() // 1
val export = js("{}") // 2
for (pair: Pair<String, Any?> in data.toList()) { // 3
    export[pair.first] = pair.second // 4
}
val jsoner = js("JSON") // 5
return jsoner.stringify(export).toString() // 6
fdbelqdn

fdbelqdn3#

如果您只想从KotlinMap中检索有效的JSON字符串,可以使用kotlinx.serialization.json

Json.encodeToString(map)

如果你想对KotlinMap进行漂亮的字符串化,它可以在<pre>标签中显示为漂亮的JSON,你可以这样做:

val jsonString = Json.encodeToString(map)            // 1
val jsonObject = JSON.parse<JsonObject>(jsonString)  // 2
return JSON.stringify(jsonObject, null, 2)           // 3

1.使用Kotlin序列化将Map序列化为JSON字符串
1.将JSON字符串解析为Javascript对象
1.漂亮的字符串化Javascript对象

jecbmhm3

jecbmhm34#

对于最新版本的kotlinx-serialization,请使用encodeToDynamic

val json = Json.encodeToDynamic(map)

结果是一个包含JSON对象的动态。这种方法有一些限制-例如,所有Map键必须是原语或枚举,并且Long值有一个最大值。有关详细信息,请参阅docs

相关问题