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

Java自定义JSON反序列化:从JSON数组提取对象的正则表达式

正确拆分JSON数组为单个对象字符串的Java实现

直接用split("}, ")拆分JSON数组的问题在于,当JSON对象内部包含嵌套对象(比如{"name":"Alice","address":{"city":"NY"}}),字符串里的},会被误判为对象分隔符,导致拆分错误。最可靠的方式是通过括号计数法遍历字符串,而非依赖正则拆分,具体实现如下:


核心思路

  1. 先去掉JSON数组首尾的方括号[],只保留内部的对象列表内容
  2. 遍历字符串时维护一个括号计数器:遇到{计数+1,遇到}计数-1
  3. 当计数器回到0时,说明当前位置是一个完整JSON对象的结尾,截取该对象字符串
  4. 跳过对象之间的逗号和空格,继续处理下一个对象

代码实现

import java.util.ArrayList;
import java.util.List;

public class JsonArraySplitter {
    public static List<String> splitJsonObjects(String jsonArray) {
        List<String> jsonObjects = new ArrayList<>();
        if (jsonArray == null || jsonArray.isEmpty()) {
            return jsonObjects;
        }

        // 去除首尾的[]并修剪空白
        String trimmedContent = jsonArray.trim();
        if (!trimmedContent.startsWith("[") || !trimmedContent.endsWith("]")) {
            throw new IllegalArgumentException("输入不是合法的JSON数组");
        }
        String content = trimmedContent.substring(1, trimmedContent.length() - 1).trim();
        if (content.isEmpty()) {
            return jsonObjects;
        }

        int braceCount = 0;
        int startIdx = 0;
        int length = content.length();

        for (int i = 0; i < length; i++) {
            char currentChar = content.charAt(i);
            if (currentChar == '{') {
                braceCount++;
            } else if (currentChar == '}') {
                braceCount--;
                // 括号计数归0,说明找到一个完整的JSON对象
                if (braceCount == 0) {
                    String objStr = content.substring(startIdx, i + 1).trim();
                    jsonObjects.add(objStr);
                    // 跳过对象之间的逗号和空白字符
                    while (i + 1 < length) {
                        char nextChar = content.charAt(i + 1);
                        if (nextChar == ',' || Character.isWhitespace(nextChar)) {
                            i++;
                        } else {
                            break;
                        }
                    }
                    startIdx = i + 1;
                }
            }
            // 注意:如果JSON字符串包含转义引号,这里需要额外处理,但大部分自定义解析场景可以忽略(若需处理可添加引号计数逻辑)
        }

        return jsonObjects;
    }

    // 测试示例
    public static void main(String[] args) {
        String jsonArray = "[{\"name\":\"Bob\",\"age\":25,\"info\":{\"hobby\":\"coding\"}}, {\"name\":\"Alice\",\"age\":30}]";
        List<String> objects = splitJsonObjects(jsonArray);
        for (String obj : objects) {
            System.out.println("单个JSON对象:");
            System.out.println(obj);
            System.out.println("---");
        }
    }
}

说明

  • 该方法不依赖任何第三方库,完全基于字符串遍历实现,适配包含嵌套对象的JSON数组
  • 若你的JSON字符串包含转义双引号(比如{"desc":"He said \"Hello\""}),需要添加额外的引号计数逻辑:遇到未转义的"时切换引号状态,在引号内部时忽略括号计数,避免误判
  • 拿到拆分后的单个JSON对象字符串后,直接复用你之前的单对象解析逻辑,即可将每个字符串转为User对象并添加到ArrayList<User>中

内容的提问来源于stack exchange,提问作者Mario Mateaș

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:34