3

我的示例代码如下:

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

3 回答 3

3

实际上,您没有得到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 对象,它允许使用任何类型的对象作为键,它暴露了类似 JavaMapAPI,在 JavaScript 对象中不可用。所以,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)
    }
    
于 2017-09-18T08:04:46.063 回答
1

这个答案比之前接受的答案晚了几年,但我(Kotlin 的新手)遇到了同样的问题,并想出了一个很好的方法来实现这一点。

  1. 假设您有一个填充的地图
  2. 创建一个空的 js 对象(对我来说似乎很老套,但这是 Kotlin 到 JS)
  3. 遍历地图的“toList”方法,该方法提供了一个 Pair
  4. 将每一对插入到 js 对象中
  5. 获取 js JSON api
  6. 并调用“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
    
于 2019-08-30T21:54:40.610 回答
0

如果您希望简单地从 Kotlin 中检索有效的 JSON 字符串Map,可以使用kotlinx.serialization.json

Json.encodeToString(map)

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

val jsonString = Json.encodeToString(map)            // 1
val jsonObject = JSON.parse<JsonObject>(jsonString)  // 2
return JSON.stringify(jsonObject, null, 2)           // 3
  1. 使用 Kotlin 序列化将映射序列化为 JSON 字符串
  2. 将 JSON 字符串解析为 Javascript 对象
  3. 漂亮地字符串化 Javascript 对象
于 2022-01-31T10:58:15.147 回答