键名不同但值一致的两个API JSON响应如何对比验证?
如何对比结构不同但值一致的两个API响应
问题背景
你有两个结构不同但业务值一致的API响应:
API1 响应
{"data": [{"sets": [{"type": "adImg", "imgs": {"attributes": [{"name": "bottomPadding", "value": "true"}], "img": {"links": [{"linkType": "PRODUCT", "label": "123", "value": "1526783"}]}}}]}]}
API2 响应
{"values": [{"contents": [{"attributes": [{"attrName": "bottomPadding", "attrValue": "true"}], "nested-Content": {"content": [{"type": "PRODUCT", "id": "123", "val": "1526783"}]}}}]}]}
两者的键名对应关系:
- API1 的
name↔ API2 的attrName - API1 的
value(属性值) ↔ API2 的attrValue - API1 的
linkType↔ API2 的type - API1 的
label↔ API2 的id - API1 的
value(链接值) ↔ API2 的val
需要验证这些对应字段的值是否完全一致。
解决方案
方案1:提取关键值逐一对比
直接从两个响应中定位到对应字段,提取值后逐一比较,适合字段数量少、结构固定的场景。
以Python为例:
import json # 解析API响应 api1_response = json.loads('{"data": [{"sets": [{"type": "adImg", "imgs": {"attributes": [{"name": "bottomPadding", "value": "true"}], "img": {"links": [{"linkType": "PRODUCT", "label": "123", "value": "1526783"}]}}}]}]}') api2_response = json.loads('{"values": [{"contents": [{"attributes": [{"attrName": "bottomPadding", "attrValue": "true"}], "nested-Content": {"content": [{"type": "PRODUCT", "id": "123", "val": "1526783"}]}}}]}]}') # 从API1提取值 api1_attr_name = api1_response['data'][0]['sets'][0]['imgs']['attributes'][0]['name'] api1_attr_value = api1_response['data'][0]['sets'][0]['imgs']['attributes'][0]['value'] api1_link_type = api1_response['data'][0]['sets'][0]['imgs']['img']['links'][0]['linkType'] api1_label = api1_response['data'][0]['sets'][0]['imgs']['img']['links'][0]['label'] api1_link_value = api1_response['data'][0]['sets'][0]['imgs']['img']['links'][0]['value'] # 从API2提取值 api2_attr_name = api2_response['values'][0]['contents'][0]['attributes'][0]['attrName'] api2_attr_value = api2_response['values'][0]['contents'][0]['attributes'][0]['attrValue'] api2_link_type = api2_response['values'][0]['contents'][0]['nested-Content']['content'][0]['type'] api2_label = api2_response['values'][0]['contents'][0]['nested-Content']['content'][0]['id'] api2_link_value = api2_response['values'][0]['contents'][0]['nested-Content']['content'][0]['val'] # 对比值 assert api1_attr_name == api2_attr_name, "属性名不一致" assert api1_attr_value == api2_attr_value, "属性值不一致" assert api1_link_type == api2_link_type, "链接类型不一致" assert api1_label == api2_label, "标签/ID不一致" assert api1_link_value == api2_link_value, "链接值不一致" print("所有对应值均一致")
方案2:标准化数据结构后整体对比
如果字段较多或结构可能扩展,先把两个响应转换成统一的标准结构,再对比整个对象,更易维护。
步骤:
- 定义键名映射规则,把API1和API2的键都转换为标准键名
- 编写转换函数,将原始响应转为标准结构
- 对比转换后的标准结构是否完全相等
以Python为例:
import json # 定义映射规则 api1_to_std = { "name": "attr_name", "value": "attr_value", "linkType": "item_type", "label": "item_id", "value": "item_val" } api2_to_std = { "attrName": "attr_name", "attrValue": "attr_value", "type": "item_type", "id": "item_id", "val": "item_val" } # 转换API1响应到标准结构 def convert_api1(data): attr = data['data'][0]['sets'][0]['imgs']['attributes'][0] link = data['data'][0]['sets'][0]['imgs']['img']['links'][0] return { "attributes": { api1_to_std['name']: attr['name'], api1_to_std['value']: attr['value'] }, "item": { api1_to_std['linkType']: link['linkType'], api1_to_std['label']: link['label'], api1_to_std['value']: link['value'] } } # 转换API2响应到标准结构 def convert_api2(data): attr = data['values'][0]['contents'][0]['attributes'][0] content = data['values'][0]['contents'][0]['nested-Content']['content'][0] return { "attributes": { api2_to_std['attrName']: attr['attrName'], api2_to_std['attrValue']: attr['attrValue'] }, "item": { api2_to_std['type']: content['type'], api2_to_std['id']: content['id'], api2_to_std['val']: content['val'] } } # 解析并转换 api1_response_str = '{"data": [{"sets": [{"type": "adImg", "imgs": {"attributes": [{"name": "bottomPadding", "value": "true"}], "img": {"links": [{"linkType": "PRODUCT", "label": "123", "value": "1526783"}]}}}]}]}' api2_response_str = '{"values": [{"contents": [{"attributes": [{"attrName": "bottomPadding", "attrValue": "true"}], "nested-Content": {"content": [{"type": "PRODUCT", "id": "123", "val": "1526783"}]}}}]}]}' api1_std = convert_api1(json.loads(api1_response_str)) api2_std = convert_api2(json.loads(api2_response_str)) # 对比标准结构 assert api1_std == api2_std, "标准化后的数据不一致" print("所有对应值均一致")
注意事项
- 注意数据类型:比如字符串
"true"和布尔值True会被判定为不等,需根据业务需求统一类型后再对比 - 如果响应中存在数组多个元素的情况,需要循环遍历每个元素进行对比
- 处理空值场景:如果字段可能为
null或不存在,需添加空值判断逻辑
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

