3 回答
TA贡献1780条经验 获得超3个赞
json对象被定义为“名称/值对的无序集合”,Python dicts也是如此(至少直到python 3.7),因此创建的dictsjson.load()的键可以以不同的顺序排列。然后,当您使用json.dump()这些字典时,将使用当前的字典键顺序来生成json。
例子:
$ cat old.json
{"a": 42, "c": {"baaz": "quux", "foo": "bar"}, "b": [1, 2, 3]}
$ cat new.json
{"a": 42, "b": [1, 2, 3], "c": {"foo": "bar", "baaz": "quux"}}
$ diff -q old.json new.json
Les fichiers old.json et new.json sont différents
d$ python
(...)
>>> import json
>>> with open("old.json") as f:
... old = json.load(f)
>>> with open("new.json") as f:
... new = json.load(f)
...
>>> old == new
True
>>>
关键是,由于密钥顺序在json中不重要,diff因此不是检查两个json字符串是否真的不同的正确工具-它们确实是执行正确json diff的相当多的工具。
就像Poshi和Vincent提到的那样,这两个json字符串与json数据等效,而与文本不同:
{"a": 42, "c": {"baaz": "quux", "foo": "bar"}, "b": [1, 2, 3]}
{"a":42, "c" : {"baaz":"quux" , "foo": "bar" } , "b" : [ 1, 2, 3] }
TA贡献1829条经验 获得超7个赞
这是您所看到的行为的最小重新表达。通过它去看看,如果你还在困惑为什么它False的new==old,但True对foo==bar。这几乎是不言自明的。
import json
def tool(jsons):
return json.dumps(json.loads(jsons))
old = '[{"key": "value" }]'
new = tool(old)
print(f'{old} == {new}', new == old)
# [{"key": "value" }] == [{"key": "value"}] False
foo = tool(new)
bar = tool(old)
print(f'{foo} == {foo}', foo == bar)
# [{"key": "value"}] == [{"key": "value"}] True
扩展它。您会看到,运行该工具可以修复所有不需要的格式。因此,最初两个文件是不同的。但是,由于在已经格式化的内容上重新运行该工具只会返回相同的结果,因此在旧文件和新文件上运行该工具将只重现两次相同的输出,即格式化后的输出。
添加回答
举报