You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

键名不同但值一致的两个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:标准化数据结构后整体对比

如果字段较多或结构可能扩展,先把两个响应转换成统一的标准结构,再对比整个对象,更易维护。

步骤:

  1. 定义键名映射规则,把API1和API2的键都转换为标准键名
  2. 编写转换函数,将原始响应转为标准结构
  3. 对比转换后的标准结构是否完全相等

以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:25:09