如何在 Kotlin 中将地图转换为 Json 字符串?

3

我有一个mutableMap对象,

    val invoiceAdditionalAttribute = mutableMapOf<String, Any?>()
    invoiceAdditionalAttribute.put("clinetId",12345)
    invoiceAdditionalAttribute.put("clientName", "digital")
    invoiceAdditionalAttribute.put("payload", "xyz")

我希望你能够将它转换为 JSON 字符串。
输出应该是:
"{\"clinetId\"=\"12345\", \"clientName\"=\"digital\", \"payload\"=\"xyz\"}"

目前,我正在使用Gson库,

val json = gson.toJson(invoiceAdditionalAttribute)

输出结果为:

{"clinetId":12345,"clientName":"digital","payload":"xyz"}

1
你使用的方法有什么问题?"{\"clinetId\"=\"12345\", \"clientName\"=\"digital\", \"payload\"=\"xyz\"}" - 这不是一个JSON字符串。JSON有它自己的格式规则,而这个字符串并不符合它的规则。gson.toJson(invoiceAdditionalAttribute) - 是正确的方法来获取JSON字符串。 - Sergio
3
输出结果看起来正确,而且我从未在 JSON 字符串中见过等于号(=)。 - Auties01
1
输出是正确的。你想要的输出(无效的JSON)被转义为""\""),以便成为Java中有效的字符串。如果你真的想要转义它,你可以这样做:String escapedJson = json.replaceAll("\"", "\\\\\""); - KunLun
你可以使用StringEscapeUtils.escapeJava进行字符串转义。 - Eklavya
1个回答

4

正确的 JSON格式字符串是:

{"clinetId":12345,"clientName":"digital","payload":"xyz"}

所以这是获得它的正确方法:
val json = gson.toJson(invoiceAdditionalAttribute)

如果您想要格式化一个字符串如下所示:

{"clinetId"=12345, "clientName"="digital", "payload"="xyz"}

只需用=替换:

val json = gson.toJson(invoiceAdditionalAttribute).replace(":", "=")

但如果你真的想要一个带有反斜杠和clientId值的字符串放在引号中:

val invoiceAdditionalAttribute = mutableMapOf<String, Any?>()
invoiceAdditionalAttribute["clinetId"] = 12345.toString()
invoiceAdditionalAttribute["clientName"] = "digital"
invoiceAdditionalAttribute["payload"] = "xyz"

val json = gson.toJson(invoiceAdditionalAttribute)
        .replace(":", "=")
        .replace("\"", "\\\"")

编辑:

正如评论中指出的那样,如果某些字符串值包含“:”字符,则.replace(":", "=")可能会很脆弱。 为了避免这种情况,我会在Map<String, Any?>上编写自定义扩展函数:

fun Map<String, Any?>.toCustomJson(): String = buildString {
    append("{")
    var isFirst = true
    this@toCustomJson.forEach {
        it.value?.let { value ->
            if (!isFirst) {
                append(",")
            }
            isFirst = false
            append("\\\"${it.key}\\\"=\\\"$value\\\"")
        }
    }

    append("}")
}

// Using extension function

val customJson = invoiceAdditionalAttribute.toCustomJson()

2
如果某些字符串值包含“:”字符,那么.replace(“:”,“=”)可能会很脆弱。 - assylias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接