【问题标题】:How to convert a map to Json string in kotlin?如何在kotlin中将地图转换为Json字符串?
【发布时间】:2020-06-23 12:21:48
【问题描述】:

我有一个 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"}

【问题讨论】:

  • 您使用的方法有什么问题? "{\"clinetId\"=\"12345\", \"clientName\"=\"digital\", \"payload\"=\"xyz\"}" - 这不是 json 字符串。 JSON 有它自己的格式化模式,并且该字符串不遵守它。 gson.toJson(invoiceAdditionalAttribute) - 是获取 json 字符串的正确方法。
  • 输出看起来对我来说是正确的,我也从未见过 = 在 json 字符串中
  • 输出是对的。您想要的输出(无效的 json)与 " 转义("\"")是 Java 的有效字符串。如果你真的想逃避它,你可以这样做String escapedJson = json.replaceAll("\"", "\\\\\"");
  • 可以使用StringEscapeUtils.escapeJava进行字符串转义

标签: java json kotlin gson


【解决方案1】:

右边json formatting string是:

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

所以这是获得它的正确方法:

val json = gson.toJson(invoiceAdditionalAttribute)

如果你想要一个格式如下的字符串:

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

只需将: 替换为=

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

但是如果你真的想要一个带有反斜杠的字符串并且clinetId 值在引号内:

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

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

编辑:

正如所指出的那样,如果某些字符串值包含“:”字符,他的 cmets .replace(":", "=") 可能会很脆弱。 为了避免这种情况,我会在Map&lt;String, Any?&gt; 上编写一个自定义扩展函数:

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()

【讨论】:

  • 如果某些字符串值包含“:”字符,.replace(":", "=") 可能会很脆弱。
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2021-01-18
  • 2020-03-16
  • 2020-01-09
  • 2019-11-19
  • 2021-10-10
相关资源
最近更新 更多