如何用Java正则正确分割数组格式的JSON对象字符串?
正确拆分JSON数组字符串为单个JSON对象的方案
这种场景我之前踩过坑!你遇到的问题本质是JSON对象内部可能包含逗号、甚至嵌套的花括号,直接用简单的split或者贪婪正则肯定会出错,下面给你几个靠谱的解决思路:
1. 优先使用JSON解析库(最稳妥)
如果你的字符串是标准的JSON数组格式,别用正则折腾了,直接用专业的JSON解析库(比如Jackson、Gson)来处理,这是最可靠的方式,能完美应对各种复杂JSON结构(比如嵌套对象、带特殊字符的字符串)。
举个Gson的示例代码:
import com.google.gson.Gson; import com.google.gson.JsonArray; public class JsonSplitExample { public static void main(String[] args) { String jsonArrayStr = "[{\"id\":1,\"name\":\"Alice\",\"desc\":\"Hello, world\"},{\"id\":2,\"name\":\"Bob\",\"info\":{\"age\":25}}]"; Gson gson = new Gson(); JsonArray jsonArray = gson.fromJson(jsonArrayStr, JsonArray.class); // 逐个取出单个JSON对象字符串 for (int i = 0; i < jsonArray.size(); i++) { String singleJson = jsonArray.get(i).toString(); System.out.println("第" + (i+1) + "个JSON对象:"); System.out.println(singleJson); } } }
这个方法的好处是:不管JSON内部有多少逗号、嵌套结构,解析库都能精准识别每个对象的边界,不会出现误拆分。
2. 用非贪婪正则匹配(适合简单场景)
如果因为某些原因不能用解析库,可以试试非贪婪模式的正则表达式,解决你之前贪婪匹配整个字符串的问题。
之前的\\{.+}是贪婪匹配,会从第一个{一直匹配到最后一个},改成\\{.*?\\}就会变成非贪婪匹配,遇到第一个}就停止,刚好匹配单个JSON对象。
示例代码:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexSplitExample { public static void main(String[] args) { String jsonArrayStr = "[{\"a\":1,\"b\":2},{\"c\":3,\"d\":4},{\"e\":5,\"f\":6}]"; // 先去掉首尾的[](如果字符串带数组包裹的话) String cleanedStr = jsonArrayStr.replaceAll("^\\[|\\]$", ""); Pattern pattern = Pattern.compile("\\{.*?\\}"); Matcher matcher = pattern.matcher(cleanedStr); List<String> singleJsonList = new ArrayList<>(); while (matcher.find()) { singleJsonList.add(matcher.group()); } // 输出结果 for (String json : singleJsonList) { System.out.println(json); } } }
⚠️ 注意:这个方法只适合没有嵌套对象的简单JSON,如果JSON里有{"key": {"inner": 1}}这种嵌套结构,非贪婪正则会在第一个}就停止匹配,导致拆分出不完整的JSON,这种情况还是得用解析库。
3. 修复你之前的split方案(仅限极端简单场景)
你之前用split("},\\{")会丢失首尾括号,其实可以拆分后手动补回去,但这个方法局限性极大,只适合完全没有嵌套、字符串里也不含},的JSON:
public class SplitFixExample { public static void main(String[] args) { String jsonArrayStr = "[{\"a\":1,\"b\":2},{\"c\":3,\"d\":4},{\"e\":5,\"f\":6}]"; String cleanedStr = jsonArrayStr.replaceAll("^\\[|\\]$", ""); String[] parts = cleanedStr.split("},\\{"); for (int i = 0; i < parts.length; i++) { if (i == 0) { // 第一个元素补结尾的} parts[i] = parts[i] + "}"; } else if (i == parts.length - 1) { // 最后一个元素补开头的{ parts[i] = "{" + parts[i]; } else { // 中间元素补首尾的{} parts[i] = "{" + parts[i] + "}"; } System.out.println(parts[i]); } } }
内容的提问来源于stack exchange,提问作者Soheil Pourbafrani
相关产品推荐
相关产品推荐

