
本文介绍如何用循环替代冗余 if 判断,安全高效地将动态 json 响应(含可变长度数组)写入 excel,避免空指针异常与性能瓶颈。
本文介绍如何用循环替代冗余 if 判断,安全高效地将动态 json 响应(含可变长度数组)写入 excel,避免空指针异常与性能瓶颈。
在使用 RestAssured 或类似 HTTP 客户端进行接口测试时,常需将大型 JSON 响应(如 data.test1[0]、data.test1[1]、data.test2[0] 等)批量写入 Excel 报告。若对每个路径硬编码独立 if (response.path(...) != null) 判断,不仅代码冗长难维护,更会因重复解析 JSON 路径导致显著性能下降——实测 400+ 条路径判断可使单次导出耗时增加数倍。
根本原因在于:response.path() 每次调用都会重新遍历 JSON 树;而嵌套数组结构(如 test1[0] ~ test1[n])具备强规律性,完全可通过程序化路径拼接 + 循环统一处理。
✅ 推荐方案:基于索引范围的智能循环写入
1. 单数组批量写入(如 data.test1[0] ~ data.test1[2])
假设已知 test1 最多返回 3 个元素(索引 0–2),推荐如下写法:
// 写入 data.test1[0], test1[1], test1[2] 到 Excel 第2~4列(列索引1~3)
for (int i = 0; i < 3; i++) {
String path = "data.test1[" + i + "]";
Object value = response.path(path);
if (value != null) {
XSSFCell cell = rowResults.createCell(i + 1); // 列索引从1开始(A→B→C…)
cell.setCellValue(value.toString());
}
}? 关键优化点:response.path() 仅调用一次/路径,且字符串拼接开销极小;避免了 3 次重复 JSON 解析。
2. 多数组批量写入(如 test1[0..2], test2[0..2])
当存在多个同构数组(test1, test2, …)时,采用双层循环 + 自增列计数器:
int colIndex = 1; // 起始列为B列(索引1)
for (int testNum = 1; testNum <= 2; testNum++) { // 遍历 test1, test2
for (int idx = 0; idx < 3; idx++) { // 遍历每个数组的 [0], [1], [2]
String path = "data.test" + testNum + "[" + idx + "]";
Object value = response.path(path);
if (value != null) {
XSSFCell cell = rowResults.createCell(colIndex++);
cell.setCellValue(value.toString());
}
}
}3. 进阶:动态探测数组长度(更健壮)
若数组长度不确定(如 test1 可能返回 0~5 个元素),可先获取数组长度再循环:
// 获取 data.test1 数组长度(若为 null 或非数组则返回 0)
JsonArray test1Array = response.jsonPath().get("data.test1");
int length = (test1Array != null) ? test1Array.size() : 0;
for (int i = 0; i < length; i++) {
String path = "data.test1[" + i + "]";
Object value = response.path(path);
if (value != null) {
rowResults.createCell(i + 1).setCellValue(value.toString());
}
}⚠️ 注意:response.jsonPath().get("data.test1") 返回 List> 或 null,需根据实际 JSON 库(如 JsonPath 2.x)调整类型转换逻辑。
? 常见错误规避指南
- 禁止嵌套路径混用:如 if(response.path("data.test1") != null) 后再取 test1[0] —— 因 test1 可能是 null 数组或缺失字段,仍会触发 NPE。
- 避免字符串拼接漏洞:使用 Integer.toString(i) 或直接字符串插值(Java 15+)比 "" + i 更安全清晰。
- 单元格复用风险:示例中 dataTest1.setCellValue(...) 是笔误(应为 dataTest2),务必确保每个 createCell() 对应独立变量或直接链式调用。
- 性能再提升:对超大数据集(>10k 单元格),启用 SXSSFWorkbook 并设置 rowAccessWindowSize=100,但本场景中瓶颈在 JSON 解析而非 POI 写入,优先优化路径访问逻辑。
✅ 总结
用参数化路径 + 循环 + 显式空值检查替代上百行重复 if,是处理此类 JSON-to-Excel 场景的标准实践。它兼具:
- 可维护性:新增 test3 仅需修改外层循环上限;
- 健壮性:每条路径独立判空,杜绝 NPE;
- 高性能:JSON 解析次数从 O(n) 降至 O(1) 每路径;
- 可扩展性:轻松适配动态长度、嵌套对象等复杂结构。
从此告别“复制粘贴式 if”,让数据导出既快又稳。










