讲师中心 微信公众号
AI工具推荐 视频效率加速

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

阿晨大大_9840

阿晨大大_9840

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

|

278人浏览过

|

来源于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, …)时,采用双层循环 + 自增列计数器:

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
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工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

2155

2023.08.07

json是什么
json是什么

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

3342

2023.08.23

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

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

1116

2023.10.13

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

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

3839

2025.09.10

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

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

549

2023.09.22

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

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

1698

2024.03.01

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

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

1778

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2764

2023.09.04

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

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

共162课时 | 44.6万人学习

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

共28课时 | 3.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn