【问题标题】:Will json.dumps(sort_keys=True ..) recursively sort nested dictionaries as well?json.dumps(sort_keys=True ..) 也会递归地对嵌套字典进行排序吗?
【发布时间】:2022-01-02 21:07:53
【问题描述】:

如果字典键被重新排序,我需要确保json.dumps 生成的字符串永远不会改变。

通过测试,通过 sort_keys=True 确实可以解决问题,并且它确实递归地确保了字段已排序。

但是official docs 对递归的性质/行为不清楚和模棱两可。

如果 sort_keys 为真(默认:假),则输出字典 将按键排序;这对于回归测试很有用,以确保 JSON 序列化可以在日常基础上进行比较。

我应该编写自己的递归函数以递归方式转储密钥还是依赖 python 来完成。

import json
a = {
  "one": "one",
  "nested": {
    "two": "two",
    "three": "three",
    "nested": {
      "four": "four",
      "five": "five"
    }
  }
}
a_str = json.dumps(a, sort_keys=True)
print(a_str)

b = {
  "nested": {    
    "three": "three",
    "two": "two",
    "nested": {      
      "five": "five",
      "four": "four"
    }
  },
  "one": "one"
}
b_str = json.dumps(b, sort_keys=True)
print(b_str)

print(a_str == b_str) # prints true
assert  a_str == b_str

assert a_str != json.dumps(b) # Works as sort_keys is False by default 

replit

【问题讨论】:

  • 是的,所有嵌套字典也将具有排序键。

标签: python json


【解决方案1】:

是的,您可以依赖这种行为。

事实上,你引用的他们的声明:

这对于回归测试很有用,以确保可以每天比较 JSON 序列化

如果sort_keys 不能递归地作用于嵌套的 JSON 对象,那就错了。

【讨论】:

    【解决方案2】:

    如果您从某种意义上阅读文档,则非常清楚

    所有已编码的字典都会对其键进行排序

    这从 JSON 编码器的源代码中也很明显; _iterencode_dict 为遇到的每个字典调用(即使从例如 default= 可调用对象返回)。

    https://github.com/python/cpython/blob/8e75c6b49b7cb8515b917f01b32ece8c8ea2c0a0/Lib/json/encoder.py#L333-L355

    def _iterencode_dict(dct, _current_indent_level):
        # ...
        if _sort_keys:
            items = sorted(dct.items())
        else:
            items = dct.items()
        # ...
    

    【讨论】:

      猜你喜欢
      • 2014-05-08
      • 1970-01-01
      • 2014-05-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多