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

时间:2018-07-26 10:01:15

标签: python json file diff

如果已经问过这个,请原谅我。我从一个简单的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
:~/$

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

谢谢。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这里是对您看到的行为的最小重新表达。仔细阅读一下,看看您是否仍然对False的{​​{1}}而不是new==old的{​​{1}}感到困惑。这几乎是自我解释。

True

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

答案 2 :(得分:0)

json对象为defined as "an unordered set of name/value pairs",Python dicts也是如此(至少直到python 3.7),因此system.time({ output <- rep(NA, 100); for (i in 1:100) { output[i] <- i + 1 }} ) 创建的dicts的键可以以不同的顺序排列。然后,当您Option Explicit Sub ForEach_Loop() Dim TrackerLastRow As Long, TrackerCurrentRow As Long Dim ContractLastRow As Long, ContractCurrentRow As Long With Worksheets("Contracts") ContractLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row ContractCurrentRow = 1 End With With Worksheets("Customer Tracker - OC") TrackerLastRow = .Cells(.Rows.Count, "T").End(xlUp).Row TrackerCurrentRow = 1 Do While TrackerCurrentRow <= TrackerLastRow If .Cells(TrackerCurrentRow, "T").Value = "Yes" Then Worksheets("Contracts").Range("A" & ContractCurrentRow) = .Range("T" & TrackerCurrentRow).Offset(0, 1).Value Worksheets("Contracts").Range("B" & ContractCurrentRow) = .Range("T" & TrackerCurrentRow).Offset(0, 2).Value ContractCurrentRow = ContractCurrentRow + 1 End If TrackerCurrentRow = TrackerCurrentRow + 1 Loop End With End Sub 那些字典时,将使用当前的字典键顺序来生成json。

示例:

json.load()

问题在于,由于密钥顺序在json中并不重要,因此json.dump()并不是检查两个json字符串是否真的不同的正确工具-并且它们确实是执行{{3 }}。

正如Poshi和Vincent所提到的那样,这两个json字符串与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
>>>