关于python中JSON内容输出的奇怪之处

如果已经问过了,请原谅我在这里。我从一个简单的python代码片段中看到了一些奇怪的结果:


import json

''' copy contents of one json file into another '''

with open('./new_file.json', 'w') as f1:

    with open('./old_file.json') as f2:

        data = json.load(f2)            

        json.dump(data, f1)

上面的代码段将一个json文件的内容复制到另一个文件中。原始文件的格式不正确(即内容全部在一行上)


运行代码后,我然后执行以下操作:


$ diff -q new_file.json old_file.json

Files new_file.json and old_file.json differ

文件内容显然不同,这很奇怪。然后,我尝试执行以下操作:


$ cat new_file.json | python -m json.tool > foo

$ cat old_file.json | python -m json.tool > bar

然后,当我比较文件bar和foo时,我得到:


:~/$ diff -q foo bar

:~/$

这表明格式化后得到的内容是相同的。有什么解释吗?


茅侃侃
浏览 165回答 3
3回答

Helenr

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.jsonLes fichiers old.json et new.json sont différentsd$ python(...)>>> import json>>> with open("old.json") as f:...     old = json.load(f)>>> with open("new.json") as f:...     new = json.load(f)... >>> old == newTrue>>> 关键是,由于密钥顺序在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] }

吃鸡游戏

这是您所看到的行为的最小重新表达。通过它去看看,如果你还在困惑为什么它False的new==old,但True对foo==bar。这几乎是不言自明的。import jsondef tool(jsons):    return json.dumps(json.loads(jsons))old = '[{"key": "value"     }]'new = tool(old)print(f'{old} == {new}', new == old)# [{"key": "value"     }] == [{"key": "value"}] Falsefoo = tool(new)bar = tool(old)print(f'{foo} == {foo}', foo == bar)# [{"key": "value"}] == [{"key": "value"}] True扩展它。您会看到,运行该工具可以修复所有不需要的格式。因此,最初两个文件是不同的。但是,由于在已经格式化的内容上重新运行该工具只会返回相同的结果,因此在旧文件和新文件上运行该工具将只重现两次相同的输出,即格式化后的输出。

繁花如伊

您已经指出:文件格式。一个文件只有一行,另一文件可能有更多行。空格可以来去去...所有这些格式设置都会使文件不同,但是内容本质上是相同的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python