为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2021-04-28 01:09:54
如果已经问过了,请原谅我在这里。我从一个简单的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.jsonFiles 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:~/$这表明格式化后得到的内容是相同的。有什么解释吗?
查看完整描述

3 回答

?
Helenr

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] }


查看完整回答
反对 回复 2021-05-11
?
吃鸡游戏

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

扩展它。您会看到,运行该工具可以修复所有不需要的格式。因此,最初两个文件是不同的。但是,由于在已经格式化的内容上重新运行该工具只会返回相同的结果,因此在旧文件和新文件上运行该工具将只重现两次相同的输出,即格式化后的输出。


查看完整回答
反对 回复 2021-05-11
?
繁花如伊

TA贡献2012条经验 获得超12个赞

您已经指出:文件格式。一个文件只有一行,另一文件可能有更多行。空格可以来去去...所有这些格式设置都会使文件不同,但是内容本质上是相同的。


查看完整回答
反对 回复 2021-05-11
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信