
本文介绍在 Java 中手动解析非标准、无分隔符的多 JSON 数组字符串(如 [...][...])的方法,通过定位 ] 边界提取独立数组,并使用 org.json 库逐个转换为 JSONArray,最终封装为 List 或映射为 Java 对象列表。
本文介绍在 java 中手动解析非标准、无分隔符的多 json 数组字符串(如 `[...][...]`)的方法,通过定位 `]` 边界提取独立数组,并使用 org.json 库逐个转换为 `jsonarray`,最终封装为 `list
在标准 JSON 规范中,一个合法的 JSON 文本只能包含单个根值(如一个对象 {} 或一个数组 [])。但实际开发中,尤其是日志流、嵌入式设备输出或某些自定义协议中,常会遇到多个 JSON 数组直接拼接的格式(例如 [...][...][...]),这种结构虽不合规,却真实存在。此时,new JSONArray(jsonString) 会因解析到第一个 ] 后仍存在剩余字符而抛出 JSONException,或(如示例中)仅静默解析首个数组——这正是问题根源。
解决思路是跳过 JSON 解析器的严格校验,转为字符串层面的边界识别:以每个 ] 作为数组结束标志,结合前序最近的 [ 确定完整数组子串,再交由 JSONArray 构造器单独解析。以下为健壮实现:
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
public class MultiJsonArrayParser {
/**
* 将连续拼接的多个 JSON 数组字符串(如 "[{...}][{...}]") 解析为 JSONArray 列表
* @param input 拼接的 JSON 数组字符串
* @return 包含所有解析成功的 JSONArray 的列表
*/
public static List<jsonarray> parseMultipleArrays(String input) {
if (input == null || input.trim().isEmpty()) {
return new ArrayList();
}
List<jsonarray> result = new ArrayList();
int start = 0;
int len = input.length();
while (start = len || input.charAt(start) != '[') {
throw new IllegalArgumentException("Expected '[' at position " + start + ", found: " +
(start arrays = parseMultipleArrays(input);
// 方案一:遍历 JSONArray → JSONObject → 手动映射
for (int idx = 0; idx trades = new ArrayList();
// for (JSONArray arr : arrays) {
// for (int i = 0; i <p>⚠️ <strong>重要注意事项</strong>: </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5980" title="javascript-pro"><img
src="https://img.php.cn/upload/skill/000/000/081/179074807567238.jpg" alt="javascript-pro" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5980" title="javascript-pro" class="overflowclass">javascript-pro</a>
<p class="overflowclass">专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发</p>
</div>
<a rel="nofollow" href="/xiazai/skill5980" title="javascript-pro" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<ul>
<li>
<strong>嵌套支持</strong>:上述 <code>findMatchingBracket</code> 方法可正确处理数组内含子数组(如 <code>[{"items":[1,2]}]</code>)的场景,避免简单 <code>indexOf("]")</code> 导致的截断错误; </li>
<li>
<strong>健壮性</strong>:增加了空值、空白、非法起始符检查,并提供清晰异常信息; </li>
<li>
<strong>性能考量</strong>:对超长输入(如 GB 级日志流),建议改用流式解析(如 Jackson 的 <code>JsonParser</code>)配合字符缓冲区,而非全文载入内存; </li>
<li>
<strong>替代方案</strong>:若可控制数据源,强烈建议改为标准 JSON Lines 格式(每行一个 JSON 数组)或外层包装为 JSON 数组 <code>[[...],[...]]</code>,从根本上规避解析难题。</li>
</ul>
<p>通过该方法,你不仅能可靠提取多个数组,还可灵活对接 Jackson/Gson 进行类型安全的反序列化,真正实现从原始字符串到领域对象的端到端转换。</p></jsonarray></jsonarray>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










