Java自定义JSON反序列化:从JSON数组提取对象的正则表达式
正确拆分JSON数组为单个对象字符串的Java实现
直接用split("}, ")拆分JSON数组的问题在于,当JSON对象内部包含嵌套对象(比如{"name":"Alice","address":{"city":"NY"}}),字符串里的},会被误判为对象分隔符,导致拆分错误。最可靠的方式是通过括号计数法遍历字符串,而非依赖正则拆分,具体实现如下:
核心思路
- 先去掉JSON数组首尾的方括号
[],只保留内部的对象列表内容 - 遍历字符串时维护一个括号计数器:遇到
{计数+1,遇到}计数-1 - 当计数器回到0时,说明当前位置是一个完整JSON对象的结尾,截取该对象字符串
- 跳过对象之间的逗号和空格,继续处理下一个对象
代码实现
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ș
相关产品推荐
相关产品推荐

