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

JSON响应排序方案:解决API预期与实际响应顺序不一致比对失败问题

API测试JSON响应数组顺序不匹配问题的解决方案

核心处理逻辑:比对前分别对预期、实际响应的Drivers数组按照指定字段DriverNumber做升序排序,消除顺序差异后再做全量字段比对,排序后天然可以识别出实际响应多出来的DriverNumber=4的差异数据,符合测试用例校验要求。

具体实现方案

  • 方案1:Python测试脚本实现(最常用的轻量测试场景)

    适配从Excel读取预期JSON、调用接口获取实际响应的场景,示例代码:
    import json
    # 1. 加载数据:your_expected_json_from_excel为从Excel读取的预期JSON字符串,your_actual_json_from_api为接口返回的响应字符串
    expected_json = json.loads(your_expected_json_from_excel)
    actual_json = json.loads(your_actual_json_from_api)
    
    # 2. 对Drivers数组按DriverNumber升序排序
    expected_json["Drivers"].sort(key=lambda x: x["DriverNumber"])
    actual_json["Drivers"].sort(key=lambda x: x["DriverNumber"])
    
    # 3. 直接比对两个JSON对象,需要输出差异可以引入deepdiff库实现
    if expected_json == actual_json:
        print("测试用例通过")
    else:
        print("测试用例失败,存在字段差异")
    
  • 方案2:Postman测试脚本实现

    如果你用Postman做接口自动化测试,直接在Tests标签页添加如下脚本即可:
    // 读取接口实际返回响应、提前存入环境变量的预期JSON
    const actualRes = pm.response.json();
    const expectedRes = pm.environment.get("expected_driver_json");
    
    // 封装排序逻辑
    const sortByDriverNumber = (arr) => arr.sort((a,b) => a.DriverNumber - b.DriverNumber);
    // 分别对两个响应的Drivers数组排序
    sortByDriverNumber(actualRes.Drivers);
    sortByDriverNumber(expectedRes.Drivers);
    
    // 执行比对校验
    pm.test("响应内容校验通过", () => {
        pm.expect(actualRes).to.eql(expectedRes);
    });
    
  • 方案3:Java实现(JVM体系测试框架场景)

    用Jackson解析JSON后排序即可,示例代码:
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.util.ArrayList;
    import java.util.Comparator;
    
    // 解析JSON字符串
    ObjectMapper mapper = new ObjectMapper();
    JsonNode expected = mapper.readTree(expectedJsonStr);
    JsonNode actual = mapper.readTree(actualJsonStr);
    
    // 提取Drivers节点后排序
    ArrayList<JsonNode> expectedDrivers = new ArrayList<>();
    expected.get("Drivers").forEach(expectedDrivers::add);
    expectedDrivers.sort(Comparator.comparingInt(o -> o.get("DriverNumber").asInt()));
    
    ArrayList<JsonNode> actualDrivers = new ArrayList<>();
    actual.get("Drivers").forEach(actualDrivers::add);
    actualDrivers.sort(Comparator.comparingInt(o -> o.get("DriverNumber").asInt()));
    
    // 替换原JSON的Drivers节点后做全量比对即可
    

优化建议

  • 如果存在多个需要忽略顺序的数组字段,可以统一封装排序逻辑,无需重复编写
  • 若存在无需校验的动态字段(比如动态时间戳、随机ID),可以提前过滤字段后再做比对
  • 从Excel读取的预期JSON如果存在转义字符,需要先做转义还原再解析为JSON对象,避免解析报错

内容的提问来源于stack exchange,提问作者Shehnaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:18:03