JKSwiftExtension icon indicating copy to clipboard operation
JKSwiftExtension copied to clipboard

sortDictionary

Open yznote opened this issue 4 months ago • 2 comments

好像只能排序最外层,如果是嵌套字典内部的未排序

yznote avatar Dec 12 '25 08:12 yznote

推荐直接使用系统的方法,比如

     let testData: [String: Any] = [
        "c_info": "基础信息",
        "a_user": [
            "name": "JoanKing",
            "age": 18,
            "profile": [
                "vip": true,
                "level": 99,
                "badge": "Gold"
            ]
        ],
        "b_device": [
            "ios_version": 17.0,
            "app_list": [
                ["id": 2, "name": "AppTwo"], // 数组里的字典1
                ["id": 1, "name": "AppOne"]  // 数组里的字典2
            ],
            "device_id": "UUID-1234"
        ]
    ]

    if let data = try? JSONSerialization.data(withJSONObject: testData, options: .sortedKeys) { // 注意这个 .sortedKeys
        let jsonString = String(data: data, encoding: .utf8)
        debugPrint(jsonString) // 输出: {"a":2,"b":1}  <-- 自动排好了
    }

JoanKing avatar Dec 12 '25 09:12 JoanKing

sortedKeys 通常用于以下几个严格依赖“顺序”的场景:

1.API 签名校验 (MD5 / SHA) 很多后端 API 要求你把参数转成 JSON 字符串,然后计算 MD5 值作为签名。如果 key 的顺序乱了,生成的字符串就不一样,算出来的 MD5 也就不一样,导致签名验证失败。使用 .sortedKeys 可以确保发送方和接收方生成的字符串完全一致。

2.数据对比 (Diff) 如果你想对比两个 JSON 数据是否发生变化,如果顺序是乱的,肉眼很难看出来,工具也会显示全是差异。排序后,只有真正改动的值会被标红。

3.缓存 Key 有些系统会把 JSON 字符串作为缓存的 Key。如果顺序变了,同一个请求就会生成不同的 Key,导致缓存失效。

JoanKing avatar Dec 12 '25 09:12 JoanKing