首页 > 解决方案 > kotlin 如何使用排序键将 JSONObject 或 Map 序列化为字符串?

问题描述

我想用 sorted_keys 将 JSONObject 或 Map 序列化为字符串。

val mapObject = mapOf<String, Any>(
    "b" to arrayOf(
        "bb",
        mapOf<String, Any>(
            "bbb" to "bbb",
            "aaa" to "aaa"
        ), 
        "aa"
    ),
    "a" to "a"
)
val jsonObject = JSONObject(mapObject)
println(jsonObject.toString())

它打印

{"b":["bb",{"bbb":"bbb","aaa":"aaa"},"aa"],"a":"a"}

但我想要它打印

{"a": "a", "b": ["bb", {"aaa": "aaa", "bbb": "bbb"}, "aa"]}

在 Python 中有

json.dumps(jsonObject, sort_keys=True)

去做这个。

在斯威夫特有

jsonObject.rawString(options: [.sortedKeys])

去做这个

但在 Android Kotlin 中似乎没有优雅的方法可以做到这一点。

标签: javaandroidkotlin

解决方案


JSONObject主要是一种不安全的中间格式,因此没有很多选项可以以这种形式使用它,主要是倾向于将反序列化为任何工作的“实际”类表示。

为此,如果您可以控制地图的输入,则可以从使用切换mapOf<String, Any>sortedMapOf<String, Any>- Kotlin 为此维护不同的实现(类似地,如果您想在构建后编辑地图,则需要 a mutableMapOf<String, Any>)。

如果您已经有一个现有的地图,您也可以使用该方法toSortedMap

默认情况下,所有排序都应基于键的自然顺序。


推荐阅读