我想比较两个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”键,因为两个文件之间的键是相同的,而我想保留的另一个键是因为值不同而已
答案 0 :(得分:0)
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数据并进行适当的字典比较。