首页 > Java > java教程 > 正文

使用正则表达式从JSON数组中提取JSON对象

聖光之護
发布: 2025-10-09 09:22:12
原创
970人浏览过

使用正则表达式从json数组中提取json对象

本文旨在提供一种使用Java正则表达式从包含多个JSON对象的JSON数组中提取单个JSON对象的方法。我们将详细介绍如何构建合适的正则表达式,并提供示例代码演示如何在Java中使用该表达式来实现JSON对象的提取,并对提取后的字符串进行优化处理,移除不必要的空白字符。

从JSON数组中提取JSON对象是一个常见的任务,尤其是在处理API响应或配置文件时。 虽然有很多JSON解析库可以处理这个问题,但使用正则表达式可以在某些情况下提供更灵活的解决方案,特别是当你只需要提取部分数据,或者JSON结构比较简单且性能是关键考虑因素时。

正则表达式详解

答案中提供的正则表达式 (?sm)(?<=^ )\{.*?(?<=^ )} 可以分解为以下几个部分:

  • (?s): 这是一个flag,表示启用dotall模式。 在dotall模式下,. 可以匹配任何字符,包括换行符。 这对于处理包含换行符的JSON对象至关重要。
  • (?m): 这是一个flag,表示启用multiline模式。 在multiline模式下,^ 和 $ 匹配每行的开头和结尾,而不是整个字符串的开头和结尾。
  • (?<=^ ): 这是一个正向后行断言。 它确保匹配的JSON对象前面有四个空格的行首。 这部分是针对问题中提供的特定JSON格式设计的,如果JSON格式不同,需要相应调整。
  • \{: 匹配一个左花括号{。 因为{在正则表达式中具有特殊含义,所以需要使用反斜杠进行转义。
  • .*?: 匹配任意字符(除了换行符,除非启用dotall模式)零次或多次,但尽可能少地匹配。 这可以确保只匹配到最近的右花括号。
  • (?<=^ )}: 这是一个正向后行断言。 它确保匹配的JSON对象后面有四个空格的行首和右花括号}。
  • }: 匹配一个右花括号}。 同样需要转义。

Java 代码示例

以下是一个完整的Java代码示例,展示如何使用该正则表达式从JSON数组中提取JSON对象:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online30
查看详情 Find JSON Path Online
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import static java.util.stream.Collectors.toList;

public class JsonExtractor {

    public static void main(String[] args) {
        String input = "[
" +
                "    {
" +
                "        "name": "User1",
" +
                "        "gender": "M"
" +
                "    },
" +
                "    {
" +
                "        "name": "User2",
" +
                "        "gender": "F"
" +
                "    }
" +
                "]";

        List<String> jsonObjects = Pattern.compile("(?sm)(?<=^    )\{.*?(?<=^    )}")
                .matcher(input).results()
                .map(MatchResult::group)
                .map(str -> str.replaceAll("[\s\n]*(?!"),)", "")) // remove whitespace
                .collect(toList());

        System.out.println(jsonObjects);
    }
}
登录后复制

代码解释:

  1. 导入必要的类: 导入 java.util.List, java.util.regex.MatchResult, java.util.regex.Pattern 和 java.util.stream.Collectors.toList。
  2. 定义输入字符串: input 变量包含包含JSON数组的字符串。
  3. 编译正则表达式: Pattern.compile("(?sm)(?<=^ )\{.*?(?<=^ )}") 编译正则表达式,创建一个Pattern对象。
  4. 创建Matcher对象并提取结果: matcher(input).results() 创建一个 Matcher 对象,然后在输入字符串上执行匹配,并返回一个 MatchResult 流。
  5. 提取匹配的字符串: .map(MatchResult::group) 从每个MatchResult对象中提取匹配的字符串。
  6. 移除空白字符: .map(str -> str.replaceAll("[\s\n]*(?!"),)", "")) 使用正则表达式 [\s\n]*(?!"),) 移除提取的JSON对象中的空白字符和换行符,但保留JSON字符串中的空白字符。(?!"),)是一个负向否定查找,确保不在双引号内部删除空格。
  7. 收集结果到List: .collect(toList()) 将提取的JSON对象收集到一个List<String>中。
  8. 打印结果: System.out.println(jsonObjects) 打印包含提取的JSON对象的列表。

注意事项

  • JSON 格式依赖: 此正则表达式高度依赖于输入的JSON字符串的格式。 如果JSON格式不一致(例如,没有四个空格的缩进),则需要修改正则表达式。
  • 复杂 JSON 结构: 对于更复杂的JSON结构,使用专门的JSON解析库(如Jackson, Gson等)通常是更好的选择。 这些库提供了更强大、更可靠的JSON处理功能。
  • 性能: 正则表达式的性能可能不如专门的JSON解析库。 如果性能至关重要,请考虑使用JSON解析库。
  • 转义字符: 在JSON字符串中,某些字符需要进行转义。 确保你的正则表达式能够正确处理这些转义字符。
  • 空白字符处理: 根据你的需求,可能需要调整空白字符的处理方式。 上面的示例移除了所有空白字符,但你可能需要保留一些空白字符以提高可读性。

总结

本文提供了一种使用Java正则表达式从JSON数组中提取JSON对象的方法。 虽然正则表达式在某些情况下很有用,但对于复杂的JSON结构,建议使用专门的JSON解析库。 在使用正则表达式时,请务必注意JSON格式依赖性、性能和转义字符等问题。 通过理解正则表达式的原理和Java代码示例,你可以根据自己的需求灵活地使用正则表达式来处理JSON数据。

以上就是使用正则表达式从JSON数组中提取JSON对象的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号