在java开发中,我们经常需要处理json数据。当面对一个包含多个json对象的数组字符串时,例如:
[
{
"name": "User1",
"gender": "M"
},
{
"name": "User2",
"gender": "F"
}
]我们的目标是将其解析成一个List
针对上述格式化的JSON数组,我们可以利用Java的正则表达式引擎来精准匹配并提取每个对象。关键在于构建一个能够识别对象起始和结束边界的正则表达式,并结合Java的Pattern和Matcher API。
我们使用的核心正则表达式是:(?sm)(?
E模式): 使^(行首)和$(行尾)匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。这个正则表达式非常依赖于输入JSON字符串的特定格式化,即每个JSON对象都以{开头,并且其闭合括号}也位于` `缩进的行首。
以下是使用Java代码实现JSON对象提取的完整示例:
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import static java.util.stream.Collectors.toList;
public class JsonObjectExtractor {
public static void main(String[] args) {
String inputJson = "[\n" +
" {\n" +
" \"name\": \"User1\",\n" +
" \"gender\": \"M\"\n" +
" },\n" +
" {\n" +
" \"name\": \"User2\",\n" +
" \"gender\": \"F\"\n" +
" }\n" +
"]";
// 编译正则表达式
Pattern pattern = Pattern.compile("(?sm)(?<=^ )\\{.*?(?<=^ )}");
// 使用Matcher查找所有匹配项
List jsonObjects = pattern.matcher(inputJson)
.results() // 获取所有匹配结果流
.map(MatchResult::group) // 提取每个匹配到的完整字符串
// 进一步处理:移除对象内部多余的空白和换行符,使其更紧凑
.map(str -> str.replaceAll("[\s\n]*(?!\",)", ""))
.collect(toList()); // 收集到List中
// 打印提取出的JSON对象
jsonObjects.forEach(System.out::println);
}
} 输出结果:
{"name":"User1","gender":"M"}
{"name":"User2","gender":"F"}本文展示了在特定场景下,如何利用Java的正则表达式功能从格式化的JSON数组字符串中提取独立的JSON对象。通过精确的正则表达式(?sm)(?