使用 Java 正则表达式或 Jackson 库从字符串中提取 JSON 数组值

使用 java 正则表达式或 jackson 库从字符串中提取 json 数组值

本文介绍了在 Java 中从包含 JSON 数组的字符串中提取特定值的三种方法。首先,推荐使用 Jackson 库进行 JSON 解析,展示了如何通过 POJO 类或 JsonNode 来提取数据。其次,提供了一种在必须手动解析的情况下,通过正则表达式捕获 JSON 数组并进行分割的方法,虽然相对复杂,但在特定场景下仍然适用。

使用 Jackson 库解析 JSON

当处理 JSON 数据时,强烈推荐使用专门的 JSON 解析库,例如 Jackson 或 Gson。这些库提供了方便的 API,可以轻松地将 JSON 字符串转换为 Java 对象,避免了手动解析的复杂性和潜在错误。

1. 使用 POJO 类

如果 JSON 结构是固定的,可以定义一个对应的 POJO(Plain Old Java Object)类,使用 Jackson 库将其自动反序列化。

立即学习“Java免费学习笔记(深入)”;

import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.json.JsonMapper;import java.io.IOException;import java.util.List;public class MyPojo {    private List values;    public List getValues() {        return values;    }    public void setValues(List values) {        this.values = values;    }    public static void main(String[] args) throws IOException {        String jsonStr = "{"values": ["abc123", "def456", "xyz789"]}";        ObjectMapper mapper = new JsonMapper();        MyPojo pojo = mapper.readValue(jsonStr, MyPojo.class);        System.out.println(pojo.getValues()); // Output: [abc123, def456, xyz789]    }}

注意事项:

确保 POJO 类的属性名与 JSON 字段名匹配。需要添加 Jackson 库的依赖。

2. 使用 JsonNode

如果 JSON 结构是动态的,或者不想定义 POJO 类,可以使用 JsonNode 来解析 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 Online 30 查看详情 Find JSON Path Online

import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.json.JsonMapper;import java.io.IOException;import java.util.List;public class JsonNodeExample {    public static void main(String[] args) throws IOException {        String jsonStr = "{"values": ["abc123", "def456", "xyz789"]}";        ObjectMapper mapper = new JsonMapper();        JsonNode node = mapper.readTree(jsonStr).get("values");        List values = mapper.readerFor(new TypeReference<List>() {}).readValue(node);        values.forEach(System.out::println);        // Output:        // abc123        // def456        // xyz789    }}

代码解释:

mapper.readTree(jsonStr) 将 JSON 字符串解析为 JsonNode 对象。.get(“values”) 获取名为 “values” 的 JSON 数组。mapper.readerFor(new TypeReference<List>() {}).readValue(node) 将 JSON 数组转换为 List。

手动解析 JSON (不推荐)

虽然不推荐,但在某些情况下,可能需要手动解析 JSON。以下提供一种使用正则表达式的方法,仅作为参考。

import java.util.Arrays;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.util.stream.Collectors;public class RegexExample {    public static void main(String[] args) {        String jsonStr = "{"values": ["abc123", "def456", "xyz789"]}";        Pattern pattern = Pattern.compile(""values"s*:s*[(.+?)]");        Matcher matcher = pattern.matcher(jsonStr);        if (matcher.find()) {            String arrayContent = matcher.group(1);            List values = Arrays.stream(arrayContent.split(","))                    .map(s -> s.replaceAll(""", "").trim())                    .collect(Collectors.toList());            values.forEach(System.out::println);            // Output:            // abc123            // def456            // xyz789        }    }}

代码解释:

Pattern.compile(“”values”s*:s*[(.+?)]”) 定义了一个正则表达式,用于匹配 “values” 数组。(.+?) 使用非贪婪模式匹配数组的内容。matcher.group(1) 获取匹配到的数组内容。arrayContent.split(“,”) 将数组内容按逗号分割成字符串数组。map(s -> s.replaceAll(“””, “”).trim()) 移除每个字符串中的引号和空格。

注意事项:

这种方法依赖于 JSON 字符串的格式,如果格式不规范,可能会出错。正则表达式的性能可能不如 JSON 解析库。务必进行充分的测试,确保正则表达式能够正确处理各种情况。

总结:

推荐使用 Jackson 或 Gson 等 JSON 解析库来处理 JSON 数据。如果必须手动解析 JSON,请谨慎使用正则表达式,并进行充分的测试。使用 JSON 解析库可以提高代码的可读性、可维护性和性能。

以上就是使用 Java 正则表达式或 Jackson 库从字符串中提取 JSON 数组值的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/327753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 12:48:25
下一篇 2025年11月5日 12:49:02

相关推荐

  • Python中msgpack库如何使用?

    msgpack是一种高效的二进制序列化格式,比JSON更小更快,适用于网络通信和缓存存储。通过pip install msgpack安装,使用packb()/unpackb()进行内存中数据的序列化与反序列化,支持dict、list、str、int等基本类型。可使用dump()/load()操作文件…

    2025年12月15日
    000
  • python check函数如何使用?

    答案:check函数是自定义函数,用于验证条件。1. 检查数据类型或范围,如check_age验证年龄是否为0-150的整数。2. 使用os.path检查文件是否存在。3. 检查字符串是否包含关键词。4. 结合异常处理,如check_positive抛出错误提示。 Python 中并没有一个叫 ch…

    2025年12月15日 好文分享
    000
  • python列表推导式是什么意思?

    列表推导式是Python中创建列表的简洁方法,1. 通过[表达式 for 变量 in 可迭代对象 if 条件]语法实现;2. 可替代传统for循环生成如平方数列表;3. 支持条件筛选,如保留偶数平方;4. 适用于数据转换与过滤,提升代码可读性和效率。 列表推导式是 Python 中一种简洁、高效地创…

    2025年12月15日
    000
  • 优化SpaCy Matcher模式匹配:理解与应用greedy参数解决长度冲突

    本教程深入探讨了SpaCy `Matcher`在处理重叠模式时可能遇到的匹配长度冲突问题。当存在多个模式,其中一个模式是另一个模式的子集时,`Matcher`默认行为可能导致较短模式优先匹配,从而阻止更长、更具体的模式被识别。文章详细介绍了如何通过`Matcher.add()`方法中的`greedy…

    2025年12月15日
    000
  • 高效合并大量数据文件的策略:绕过解析实现快速连接

    处理大量数据文件时,直接使用数据帧库的合并功能(如polars的`read_ipc`配合`rechunk=true`)可能因数据解析和内存重分块而导致性能瓶颈。本文介绍了一种绕过完整数据解析、直接在文件系统层面进行内容拼接的策略,以显著加速文件合并过程,并探讨了针对apache arrow等特定格式…

    2025年12月15日
    000
  • 使用Python PDDL框架构建旅行商问题:Effect表达式的正确姿势

    本文旨在指导用户在使用`pddl` python框架构建旅行商问题(tsp)时,如何正确处理pddl动作的`effect`表达式。通过分析常见的`recursionerror`,揭示了将pddl逻辑表达式误用字符串拼接的错误,并提供了使用框架内置逻辑运算符(如`&`和`~`)来组合谓词的正确…

    2025年12月15日
    000
  • Python中利用自定义类实现分层字符串常量与点符号路径自动构建

    本文深入探讨如何在python中优雅地组织分层字符串常量,尤其适用于http端点路径等场景。通过自定义`endpoint`类,我们能够实现类似点符号的层级访问,并自动构建完整的路径字符串,显著提升代码的可读性、可维护性及开发效率。 在构建需要与分层API(如RESTful服务)交互的Python客户…

    2025年12月15日
    000
  • 精通Django角色与权限管理:构建灵活的访问控制系统

    django提供强大的用户、组和权限系统,可用于实现精细的角色访问控制。本文将深入探讨如何利用django的内置功能,结合自定义逻辑,为不同用户角色(如经理、普通用户)分配差异化的数据访问权限,特别是如何实现部门级数据隔离,确保系统安全与业务需求。我们将从模型设计、组与权限配置,到视图层的数据过滤,…

    2025年12月15日
    000
  • python中如何实现自动化操纵浏览器?

    Selenium库可用于Python中自动化操纵浏览器,支持Chrome、Firefox等,通过安装selenium包和对应驱动实现;示例包括打开百度、定位搜索框输入“Python”并提交;常用操作有元素定位、点击、输入、获取页面信息及等待机制;可通过ChromeOptions设置无头模式运行;尽管…

    2025年12月15日
    000
  • 从Google Drive下载并解压ZIP文件至Colab Notebook

    本教程详细介绍了如何在Google Colab环境中,无需挂载Google Drive,从公共Google Drive链接下载并解压ZIP文件。文章分析了常见的`BadZipFile`错误原因,提供了使用`requests`库构建正确下载URL的方法,并重点推荐了更便捷、鲁棒的`gdown`库,以确…

    2025年12月15日
    000
  • 从HTML表单获取逗号分隔值:转换为NumPy数组并用于机器学习预测

    本教程详细讲解了如何处理从HTML表单获取的逗号分隔字符串,将其正确转换为NumPy数值数组,并解决机器学习模型预测时常见的数组形状错误。通过字符串解析、类型转换和数组重塑,确保输入数据符合模型要求,实现准确预测。 从HTML表单获取逗号分隔值的挑战与解决方案 在Web应用开发中,我们经常需要从用户…

    2025年12月15日
    000
  • Python中Collections模块数据类型如何使用?

    Collections模块提供高效容器:Counter统计频次,defaultdict自动初始化,OrderedDict保持顺序,deque支持双端操作,提升代码简洁性与性能。 Python 的 Collections 模块提供了比内置数据类型更高级、更灵活的容器类型,能够简化特定场景下的代码逻辑。…

    2025年12月15日
    000
  • Mac M1 芯片安装 Python 的注意事项

    在Mac M1芯片上安装Python需确保使用原生ARM64架构以获得最佳性能,避免通过Rosetta 2运行的x86_64版本以防依赖冲突和性能损失;2. 推荐使用pyenv + Homebrew或Miniforge进行安装,前者适合通用开发并可灵活管理多版本Python,后者专为数据科学优化且支…

    2025年12月15日
    000
  • 如何使用python中的pypy解释器?

    PyPy是Python的高性能替代解释器,通过JIT技术提升执行速度。安装方式因系统而异:Ubuntu用sudo apt install pypy3,macOS用brew install pypy3,Windows需从官网下载并配置环境变量。运行脚本使用pypy3命令,如pypy3 hello.py…

    2025年12月15日
    000
  • python中pickle模块是什么?

    pickle模块用于Python对象的序列化和反序列化,可将列表、字典、类实例等保存到文件或用于网络传输;基本用法包括使用pickle.dump()写入数据和pickle.load()读取数据;需注意其生成的是二进制格式,仅限Python内部使用,存在安全风险和版本兼容性问题,不适用于跨语言场景。 …

    2025年12月15日 好文分享
    000
  • python集合和列表推导式哪种方法去重快

    集合去重更快因其哈希实现,时间复杂度O(1);列表推导式查重为O(n²)较慢;需保序时推荐dict.fromkeys(),兼具性能与顺序。 在 Python 中,用集合(set)和列表推导式去重,集合去重更快。原因在于数据结构和时间复杂度的差异。 集合去重:高效且简洁 集合是哈希实现的,插入和查找平…

    2025年12月15日
    000
  • python中如何在排序时使用str.lower?

    答案:使用 key=str.lower 可实现忽略大小写的排序。通过 sorted() 或 list.sort() 的 key 参数传入 str.lower,使字符串按小写形式比较,但保留原值,常用此法实现不区分大小写的排序。 在 Python 中,如果想在排序时忽略大小写,可以通过 str.low…

    2025年12月15日
    000
  • 如何使用Python Flashtext模块?

    Flashtext是一款高效Python模块,利用Trie树结构实现快速关键词提取与替换,支持批量添加、不区分大小写模式,适用于日志处理、敏感词过滤等场景,性能优于正则表达式。 Flashtext 是一个高效的 Python 模块,用于在文本中快速提取关键词或替换多个关键词。相比正则表达式,它在处理…

    2025年12月15日
    000
  • python日志记录器的配置

    日志配置需设置级别、格式和输出目标,推荐使用字典配置管理。1. 设置日志级别为DEBUG或INFO以控制输出;2. 自定义格式包含时间、级别、模块名等;3. 输出到文件和控制台;4. 创建独立logger实例避免全局调用;5. 使用dictConfig集中管理复杂配置,防止重复handler和错误传…

    2025年12月15日
    000
  • python协程里yield from如何使用?

    yield from用于委托生成器执行,可简化代码并实现数据透传、异常传递和双向通信。 在Python协程中,yield from 主要用于委托生成器或协程的执行,把当前生成器的操作“转发”给另一个可迭代对象或子生成器。它不仅简化了代码,还能让外层生成器直接与内层生成器通信,实现数据的透传和异常传递…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信