0

0

高效处理 JSON 数组路径并写入 Excel:Apache POI 优化实践

花韻仙語

花韻仙語

发布时间:2026-02-18 15:32:03

|

258人浏览过

|

来源于php中文网

原创

高效处理 JSON 数组路径并写入 Excel:Apache POI 优化实践

本文介绍如何用循环替代冗余 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”,让数据导出既快又稳。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

766

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

817

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

553

2023.08.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 17.8万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号