Python 如何按字母顺序对JSON树进行完全排序
我需要在python中对JSON对象进行完整的递归字母排序 原因是能够区分两个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,
{
"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-kwargsort_-keys
来完成此操作
a_json = json.dumps(json_object, sort_keys=True)
print(a_json)
您可以使用
json.dump/s
native-kwargsort_-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代码。