Python 如何比较两个json文件并打印差异报告

Python 如何比较两个json文件并打印差异报告,python,html,json,compare,Python,Html,Json,Compare,我想比较两个json文件,并通过python程序准备一份报告。我使用了一个名为jsoncompare的可用库 我所尝试的: from jsoncompare import jsoncompare as json_comp json_comp.long = int json_comp.unicode = str json_comp.xrange = range a = [ { "Key": "Name", "Value": "node1" }, { "K

我想比较两个json文件,并通过python程序准备一份报告。我使用了一个名为jsoncompare的可用库

我所尝试的:

from jsoncompare import jsoncompare as json_comp

json_comp.long = int
json_comp.unicode = str
json_comp.xrange = range



a = [
  {
    "Key": "Name",
    "Value": "node1"
  },
  {
    "Key": "owner",
    "Value": "jhonson"
  },
  {
    "Key": "managed",
    "Value": "yes"
  }
]

b = [
  {
    "Key": "Name",
    "Value": "node1"
  },
  {
    "Key": "owner",
    "Value": "jhonson"
  },
  {
    "Key": "managed",
    "Value": "No"
  }
]

# Compare respecting each array's order
json_comp.are_same(a, b)

print(json_comp.are_same(a, b)[1])
以上各项的产出:

  Reason: Different values
Expected:
  "yes"
Actual:
  "No"

Reason: Different values (Check order)
Expected:
  {
      "Key": "managed",
      "Value": "yes"
  }
Actual:
  {
      "Key": "managed",
      "Value": "No"
  }
当两个json都匹配时,我不会得到任何输出,但即使匹配,我也需要打印值,并在报告的差异(是或否)列中说“是”

表格式的预期输出可能为html,例如:

逻辑:

1)value for key Name starts with lowercase + value match  -- Yes
2)value for key Name starts uppercase but  value matches  -- No
3)for other keys When value does not match its - No
4)for other keys When value does match (irrespective of case) its - Yes

有人能提出更好的方法吗,或者请提供参考。

如果您的钥匙相同,您可以在这里使用熊猫:

import pandas as pd 

with open('a.json', 'r+') as f:
    data_a = json.load(f)
with open('b.json', 'r+') as f:
    data_b = json.load(f)
df_a = pd.json_normalize(data_a)
df_b = pd.json_normalize(data_b)
df = pd.merge(df_a, df_b, left_index=True, right_index=True)
df['diff'] = np.where((df['Key_x']=='Name') & (df['Value_x'].str.contains(r'^[a-z]')) & (df['Value_y'].str.contains(r'^[a-z]'))  & (df['Value_x']==df['Value_y']), 'No', 'Yes')
df['diff'] = np.where((df['Key_x']!='Name') & (df['Value_x']!=df['Value_y']), 'Yes', 'No')
print(df)

     Key_x  Value_x    Key_y Value_y diff
0     Name    node1     Name   node1   No
1    owner  jhonson    owner  wright  Yes
2  managed      yes  managed      No  Yes
您可以使用以下方法将其转换为html:

df.to_html('test.html')

如果json结构是固定的,就像上面提到的那样,为什么不能简单地循环键并进行比较呢?你已经有了你的逻辑,所以简单的做一个if-else并打印“true”或“false”。你的密钥是相同的吗?是的,密钥是相同的。你让我测试一下,我有文件格式的源json,我如何读取上面代码中的file.json?这是区分大小写的匹配。要使第一个条件起作用,您必须添加多个条件。一点也不难,但我需要运行,我会在一段时间后尝试添加编辑。我使用np.where作为条件-
np.where(条件,如果为真,则为值,如果为假)
Yes导入numpy作为np只需在类似于value的新行中添加另一个条件即可