Python比较两个json文件并仅获得区别

时间:2019-01-25 14:19:55

标签: python json compare diff

我想比较两个json文件并仅获取它们之间的区别。

我有一个可以比较两个json文件的代码,但是他得到的行是相同的,而我只想要区别。

+     "AAAA": {
+       "name": "toto",
+       "age": null
+     },
      "BBBB": {
        "name": "tete",
        "age": 26
      },
-     "CCCC": {
?               ^ ^ ^^^
+     "DDDD": {
?               ^ ^ ^^^
-       "name": "tete",
?                   ^^^      ^
+       "age": "45",


with open('orig.json') as orig_file, open('target.json') as target_file:
    diff = difflib.Differ()
    result = diff.compare(target_file.readlines(),    orig_file.readlines())
    print("### JSON DIFF ###")
    print(''.join(result))

如果密钥值相同,我不想保留,但是如果密钥值不同,我想保留密钥。

对于我的实例,我不想保留“ BBBB”键,因为两个文件之间的键是相同的,而我想保留的另一个键是因为值不同而已

2 个答案:

答案 0 :(得分:0)

根据documentation

  

Differ delta的每一行都以两个字母的代码开头:

| Code | Meaning                                   |
|------|-------------------------------------------|
| '- ' | line unique to sequence 1                 |
| '+ ' | line unique to sequence 2                 |
| '  ' | line common to both sequences             |
| '? ' | line not present in either input sequence |

因此,基本上,您要做的就是过滤以"- ""+ "开头的行。

result = diff.compare(target_file.readlines(), orig_file.readlines())
result = [line for line in result if line.startswith(("- ", "+ "))]

答案 1 :(得分:0)

可以应用julienc的答案-给出问题的提法,这在技术上是正确的-但是对json字符串进行文本比较已损坏-由于存在相同数据的许多不同有效json表示形式不重要的空格/缩进,以及将json对象定义为无序集合的事实(因此{"foo":42, "bar":true}{"bar": true, "foo":42}在文本上是不同的,但一旦未序列化就严格等于。< / p>

IOW,可行的解决方案是反序列化json数据并进行适当的字典比较。