Python 如何按字母顺序对JSON树进行完全排序

Python 如何按字母顺序对JSON树进行完全排序,python,json,sorting,Python,Json,Sorting,我需要在python中对JSON对象进行完整的递归字母排序 原因是能够区分两个json文件 鉴于这一投入: { "request-id": "12345", "version": "1.1.4", "multi": { "one": 1, "two": 2.0,

我需要在python中对JSON对象进行完整的递归字母排序

原因是能够区分两个json文件

鉴于这一投入:

{
    "request-id": "12345",
    "version": "1.1.4",
    "multi": {
            "one": 1, 
            "two": 2.0,
            "Abc": [3,2,4,1, null],
            "three": null,
            "list": [
                        {"lb1": 2.1},
                        {"lb": 2.2}, 
                        {"la": 3}, 
                        {"mix_list": [1, {"bb":1}, 2, {"aa":1}]}]
        }
}
这是预期输出:

{
    "multi": {
        "Abc": [1,2,3,4,null],
        "list": [
            {"la": 3},
            {"lb": 2.2},
            {"lb1": 2.1},
            { "mix_list": [1, 2, {"aa": 1}, {"bb": 1}] }
        ],
        "one": 1,
        "three": null,
        "two": 2.0
    },
    "request-id": "12345",
    "version": "1.1.4"
}

编辑:为了能够进行区分,它还应该对数组元素进行排序。

JSON对象是一个简单的dict对象。在版本3.7之前,dicts没有顺序,因此首先需要将其转换为OrderedDict,然后以正确的顺序追加每个json元素。使用3.7+您可以依赖标准dict订购

import json
from operator import itemgetter

# replace all three {} with OrderedDict() for python <= 3.6

def sorted_json(js, result):

    def norm_str(s):
        # because of str special handling of single quotes
        return str(s).replace("'", '"')

    if type(js) in [int, str, bool, float] or js is None:
        return js

    if type(js) == list:
        res = [sorted_json(i, {}) for i in js]
        return sorted(res, key=norm_str)

    items = sorted(js.items(), key=itemgetter(0))
    for k, v in items:
        result[k] = sorted_json(v, {})

    return result
具有键的对象根据其键进行排序,列表中的对象根据其“排序递归字符串表示”进行排序,而基元值根据其自然顺序进行排序

import json
from operator import itemgetter

# replace all three {} with OrderedDict() for python <= 3.6

def sorted_json(js, result):

    def norm_str(s):
        # because of str special handling of single quotes
        return str(s).replace("'", '"')

    if type(js) in [int, str, bool, float] or js is None:
        return js

    if type(js) == list:
        res = [sorted_json(i, {}) for i in js]
        return sorted(res, key=norm_str)

    items = sorted(js.items(), key=itemgetter(0))
    for k, v in items:
        result[k] = sorted_json(v, {})

    return result

JSON对象是一个简单的dict对象。在版本3.7之前,dicts没有顺序,因此首先需要将其转换为OrderedDict,然后以正确的顺序追加每个json元素。使用3.7+您可以依赖标准dict订购

import json
from operator import itemgetter

# replace all three {} with OrderedDict() for python <= 3.6

def sorted_json(js, result):

    def norm_str(s):
        # because of str special handling of single quotes
        return str(s).replace("'", '"')

    if type(js) in [int, str, bool, float] or js is None:
        return js

    if type(js) == list:
        res = [sorted_json(i, {}) for i in js]
        return sorted(res, key=norm_str)

    items = sorted(js.items(), key=itemgetter(0))
    for k, v in items:
        result[k] = sorted_json(v, {})

    return result
具有键的对象根据其键进行排序,列表中的对象根据其“排序递归字符串表示”进行排序,而基元值根据其自然顺序进行排序

import json
from operator import itemgetter

# replace all three {} with OrderedDict() for python <= 3.6

def sorted_json(js, result):

    def norm_str(s):
        # because of str special handling of single quotes
        return str(s).replace("'", '"')

    if type(js) in [int, str, bool, float] or js is None:
        return js

    if type(js) == list:
        res = [sorted_json(i, {}) for i in js]
        return sorted(res, key=norm_str)

    items = sorted(js.items(), key=itemgetter(0))
    for k, v in items:
        result[k] = sorted_json(v, {})

    return result

您可以使用
json.dump/s
native-kwarg
sort_-keys
来完成此操作

a_json = json.dumps(json_object, sort_keys=True)
print(a_json)

您可以使用
json.dump/s
native-kwarg
sort_-keys
来完成此操作

a_json = json.dumps(json_object, sort_keys=True)
print(a_json)

sort_keys
对键进行排序,但不对数组值进行排序,因此不足以区分两个json文件。我澄清了我的问题。
sort_keys
对键进行排序,但不对数组值进行排序,因此不足以区分两个json文件。我澄清了我的问题。@superbrain订购仅从3.7版开始得到正式保证(在3.6版中“不应依赖”)。我会修正我的答案,让它更清晰。@superbrain记住这一点是明智的,以防您想要修改超过两年半的python代码。这可以说是大多数python代码仍然存在的问题。@superbrain排序从3.7版开始就得到了正式保证(在3.6版中,“不应该依赖它”)。我会修正我的答案,让它更清晰。@superbrain记住这一点是明智的,以防您想要修改超过两年半的python代码。可以说这仍然是大部分python代码。