Java中解析JSON数组中的对象:从传统迭代到Stream API

Java中解析JSON数组中的对象:从传统迭代到Stream API

本文详细介绍了在java中如何从嵌套的json数组中提取特定对象的数据。针对`{“result”:[{“result”:”success”,”id”:”345″}]}`这类结构,教程提供了两种主要方法:一是结合pojo(或java 16 record)使用传统循环迭代解析,二是利用java stream api进行更简洁的函数式处理。通过代码示例,读者将掌握如何高效、优雅地从json响应中获取所需信息。

在现代Web应用开发中,与服务器进行数据交互并解析JSON响应是常见任务。当我们收到一个包含JSON数组的响应,并且数组中的每个元素又是一个JSON对象时,如何高效地提取这些对象的特定字段值就显得尤为重要。本文将以一个典型的JSON结构为例,深入探讨在Java中实现这一目标的两种主要方法:传统的循环迭代结合POJO(Plain Old Java Object)或Java 16 Record,以及更现代、函数式的Stream API。

理解JSON结构

假设我们从服务器接收到以下JSON响应:

{"result":[{"result":"success","id":"345"}]}

这个JSON结构包含一个顶层对象,其键为”result”,对应的值是一个JSON数组。这个数组中只有一个元素,它又是一个JSON对象,包含”result”和”id”两个字段。我们的目标是从这个内部对象中提取”id”和”result”的值。

方法一:传统循环迭代与POJO/Record

处理这种JSON结构的第一步是获取内部的JSONArray。然后,我们可以遍历这个数组,对每个内部的JSONObject进行解析。为了更好地封装数据,我们可以定义一个Java类或Java 16的Record来映射JSON对象的结构。

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

1. 定义数据模型(Record)

Java 16引入的Record提供了一种简洁的方式来定义不可变的数据类。对于像{“result”:”success”,”id”:”345″}这样的简单结构,Record非常适用。

public record Result(String result, int id) {}

这个Result Record将直接映射JSON对象中的”result”(字符串类型)和”id”(整数类型)字段。

2. 解析JSON并迭代

接下来,我们将使用org.json库来解析JSON字符串,并通过循环迭代JSONArray来提取数据。

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 org.json.JSONArray;import org.json.JSONObject;import java.util.ArrayList;import java.util.List;public class JsonParserTraditional {    public static void main(String[] args) {        String response = """            {"result":[{"result":"success","id":"345"}]}        """;        try {            // 获取顶层JSONObject            JSONObject jsonObject = new JSONObject(response);            // 获取名为"result"的JSONArray            JSONArray array = jsonObject.getJSONArray("result");            List results = new ArrayList();            // 遍历JSONArray            for (int i = 0; i < array.length(); i++) {                // 获取数组中的每个JSONObject                JSONObject res = array.getJSONObject(i); // 使用 getJSONObject(i) 更直接                // 提取字段值并创建Result对象                results.add(new Result(res.getString("result"), res.getInt("id")));            }            // 打印结果            results.forEach(System.out::println);        } catch (Exception e) {            e.printStackTrace();        }    }}

输出:

Result[result=success, id=345]

代码解释:

首先,我们创建了一个JSONObject来解析整个响应字符串。然后,通过jsonObject.getJSONArray(“result”)获取了名为”result”的JSONArray。使用一个标准的for循环遍历JSONArray。在每次迭代中,array.getJSONObject(i)会返回当前索引处的JSONObject。从这个内部JSONObject中,我们使用getString(“result”)和getInt(“id”)来提取相应字段的值,并用这些值构造Result对象,然后将其添加到results列表中。

方法二:使用Java Stream API

对于Java 8及更高版本,Stream API提供了一种更简洁、更具函数式编程风格的方式来处理集合数据。它可以将JSONArray转换为一个流,然后通过一系列操作(如map、filter等)来转换和收集数据。

1. 转换JSONArray到Stream

org.json库的JSONArray本身并没有直接提供转换为Stream的方法。我们可以利用java.util.stream.StreamSupport工具类,结合JSONArray的spliterator()方法来创建一个Stream。

2. 解析JSON并使用Stream API

import org.json.JSONArray;import org.json.JSONObject;import java.util.List;import java.util.stream.StreamSupport; // 导入StreamSupport// 假设 Result record 已定义public class JsonParserStream {    public static void main(String[] args) {        String response = """            {"result":[{"result":"success","id":"345"}]}        """;        try {            JSONObject jsonObject = new JSONObject(response);            JSONArray array = jsonObject.getJSONArray("result");            List results = StreamSupport.stream(array.spliterator(), false) // 将JSONArray转换为Stream                .map(JSONObject.class::cast) // 将Stream中的每个元素转换为JSONObject                .map(json -> new Result(json.getString("result"), json.getInt("id"))) // 映射为Result对象                .toList(); // Java 16+ 收集到List,或使用 .collect(Collectors.toList())            results.forEach(System.out::println);        } catch (Exception e) {            e.printStackTrace();        }    }}

输出:

Result[result=success, id=345]

代码解释:

StreamSupport.stream(array.spliterator(), false):这是关键一步,它将JSONArray转换为一个Stream。spliterator()方法返回一个Spliterator,false表示非并行流。.map(JSONObject.class::cast):由于JSONArray的spliterator返回的是Object类型,我们需要将其向下转型为JSONObject。JSONObject.class::cast是一个方法引用,等同于obj -> (JSONObject) obj。.map(json -> new Result(json.getString(“result”), json.getInt(“id”))):这是核心转换逻辑,对于流中的每个JSONObject,我们提取”result”和”id”字段,并用它们构造一个新的Result对象。.toList():这是Java 16及更高版本提供的便捷方法,用于将流中的元素收集到一个不可变的List中。如果使用旧版本Java,可以使用collect(Collectors.toList())。

注意事项与总结

错误处理: 在实际应用中,解析JSON时应始终包含健壮的错误处理机制。org.json库在遇到键不存在或类型不匹配时会抛出JSONException。使用try-catch块捕获这些异常是必要的。选择合适的JSON库: 虽然org.json库简单易用,但对于更复杂的JSON操作和更高级的特性(如数据绑定、自定义序列化/反序列化),通常会推荐使用功能更强大的库,如Jackson或Gson。这些库通常提供更直接的方式将JSON映射到POJO,并支持更复杂的嵌套结构。数据类型匹配: 确保从JSON中提取的数据类型与Java对象中的字段类型相匹配。例如,如果JSON中的id是字符串,但您在Record中定义为int,则需要进行适当的类型转换或调整Record定义。可读性与性能: 传统循环迭代在简单场景下直观易懂,性能通常也足够。Stream API则提供了更声明式、简洁的代码,尤其在处理复杂转换链时能显著提高代码可读性。在大多数业务场景下,两者的性能差异可以忽略不计。

通过本文的介绍,您现在应该掌握了在Java中从嵌套JSON数组中提取数据的两种有效方法。根据您的项目需求和Java版本,可以选择最适合您的方法来高效地处理JSON响应。

以上就是Java中解析JSON数组中的对象:从传统迭代到Stream API的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在 macOS 中授予第三方应用程序 Apple Music 访问权限
上一篇 2026年10月19日 21:09:03
下一篇 2025年12月21日 17:21:15

相关推荐

  • Java方法参数灵活处理:重载与可变参数详解

    Java方法参数灵活处理:重载与可变参数详解Java方法参数灵活处理:重载与可变参数详解Java方法参数灵活处理:重载与可变参数详解Java方法参数灵活处理:重载与可变参数详解

    本文深入探讨了在java中创建能够接受不同数量参数的方法的两种主要策略:方法重载和可变参数(varargs)。通过详细的代码示例,我们展示了如何利用这些机制来设计灵活且易于维护的方法,从而实现诸如根据有无参数清空特定缓存项或整个缓存的功能,并提供了选择合适方法的指导原则。 在软件开发中,我们经常需要…

    2026年10月19日 • 用户投稿
    100
  • 问小白AI网页版人口

    小白AI是基于人工智能的在线助手,提供文本生成、代码辅助、图像处理、数据分析及智能客服等功能,支持网页端多场景应用,具备零门槛、多端同步和持续更新优势,适用于个人与企业用户。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 小白AI是一款基于…

    2026年10月19日
    000
  • 吉利自研大模型与DeepSeek深度融合,推动汽车AI发展

    吉利自研大模型与DeepSeek深度融合,推动汽车AI发展吉利自研大模型与DeepSeek深度融合,推动汽车AI发展吉利自研大模型与DeepSeek深度融合,推动汽车AI发展吉利自研大模型与DeepSeek深度融合,推动汽车AI发展

    吉利汽车携手deepseek r1大模型,提升智能汽车ai能力 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 吉利汽车近日宣布,其自研大模型已与DeepSeek R1模型完成深度融合。此次合作将通过蒸馏训练技术,优化星睿车控Function…

    2026年10月19日 • 用户投稿
    700
  • 必应bing国际版官网入口 必应国际搜索网页访问地址

    必应bing国际版官网入口 必应国际搜索网页访问地址必应bing国际版官网入口 必应国际搜索网页访问地址必应bing国际版官网入口 必应国际搜索网页访问地址必应bing国际版官网入口 必应国际搜索网页访问地址

    必应bing国际版官网入口是https://www.bing.com/,该网址支持多语言内容检索、提供视觉化搜索服务及集成智能辅助工具。 必应bing国际版官网入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来必应国际搜索网页访问地址,感兴趣的网友一起随小编来瞧瞧吧! https://w…

    2026年10月19日 • 用户投稿
    100
  • 如何用VSCode连接并开发远程服务器上的项目?

    如何用VSCode连接并开发远程服务器上的项目?如何用VSCode连接并开发远程服务器上的项目?如何用VSCode连接并开发远程服务器上的项目?如何用VSCode连接并开发远程服务器上的项目?

    使用VSCode通过Remote-SSH插件连接远程服务器开发,需先安装插件并配置SSH信息,保存主机后点击左下角绿色标签连接,VSCode自动安装服务端组件,连接成功后打开远程项目目录即可像本地一样编辑、运行、调试代码,所有操作均在远程执行,提升开发效率。 使用 VSCode 连接远程服务器开发项…

    2026年10月19日 • 用户投稿
    000
  • Java中int类型溢出原理与BigInteger解决方案

    Java中int类型溢出原理与BigInteger解决方案Java中int类型溢出原理与BigInteger解决方案Java中int类型溢出原理与BigInteger解决方案Java中int类型溢出原理与BigInteger解决方案

    本文深入探讨了Java中`int`类型在进行大数运算(如阶乘)时可能发生的溢出问题。通过分析一个具体的阶乘计算示例,解释了`int`类型固定存储范围导致数值溢出并最终变为0的原理。文章提供了使用`java.math.BigInteger`类来处理任意精度整数运算的解决方案,并附有示例代码,旨在帮助开…

    2026年10月19日 • 用户投稿
    100
  • VSCode多语言配置技巧

    VSCode多语言配置技巧VSCode多语言配置技巧VSCode多语言配置技巧VSCode多语言配置技巧

    正确配置VSCode多语言开发环境需四步:安装语言包切换界面语言,为各语言设置调试运行参数,统一代码风格工具,按模块分层管理项目结构。 VSCode支持多语言开发,通过合理配置可以大幅提升编码效率和开发体验。关键在于正确设置语言环境、安装对应扩展、配置调试参数以及统一代码风格。 安装并切换显示语言 …

    2026年10月19日 • 用户投稿
    000
  • 阿里缩减合伙人人数,AI纳入核心业务范畴

    阿里缩减合伙人人数,AI纳入核心业务范畴阿里缩减合伙人人数,AI纳入核心业务范畴阿里缩减合伙人人数,AI纳入核心业务范畴阿里缩减合伙人人数,AI纳入核心业务范畴

    少了437个字,少了9个人。 6月26日晚间,阿里巴巴集团发布2025财年年报。业绩数据早在一个月前公布,年报的重点是管理层对战略和业务的思考,而“致股东的信”是整个年报的精髓。 对比发现,2025财年少了一页A4纸的描述。内容上,年报不再单独展开阐述“经营原则”,转而反复强调AI的重要性,甚至将A…

    2026年10月19日 • 用户投稿
    100
  • VSCode侧边栏管理技巧

    VSCode侧边栏管理技巧VSCode侧边栏管理技巧VSCode侧边栏管理技巧VSCode侧边栏管理技巧

    合理管理VSCode侧边栏可提升效率,通过隐藏不常用视图(如扩展、测试)、拖拽分组布局、自定义图标顺序和快捷键,按项目需求动态调整显示内容,减少干扰并加快操作速度。 VSCode的侧边栏是提升开发效率的重要区域,合理管理能让工作更流畅。关键在于灵活控制显示内容、快速切换和个性化布局。 按需启用或隐藏…

    2026年10月19日 • 用户投稿
    000
  • 筑牢人工智能安全防火墙

    筑牢人工智能安全防火墙筑牢人工智能安全防火墙筑牢人工智能安全防火墙筑牢人工智能安全防火墙

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 近期,深度求索人工智能基础技术研究有限公司(DeepSeek)推出的生成式AI服务引发广泛关注,但也暴露出其面临日益严峻的网络安全挑战,攻击事件频发,服务中断和数据泄露风险不容忽视。 保障人工智…

    2026年10月19日 • 用户投稿
    200
  • 如何在Java中实现文件上传下载功能

    如何在Java中实现文件上传下载功能如何在Java中实现文件上传下载功能如何在Java中实现文件上传下载功能如何在Java中实现文件上传下载功能

    实现文件上传需配置multipart参数并用MultipartFile接收,保存至指定目录;2. 文件下载通过UrlResource返回文件流,设置Content-Disposition响应头触发下载;3. 前端使用form表单提交测试,生产环境需增加安全校验。 在Java中实现文件上传和下载功能,…

    2026年10月19日 • 用户投稿
    200
  • 联想笔记本电脑散热风扇维护及更换全流程讲解

    联想笔记本电脑散热风扇维护及更换全流程讲解联想笔记本电脑散热风扇维护及更换全流程讲解联想笔记本电脑散热风扇维护及更换全流程讲解联想笔记本电脑散热风扇维护及更换全流程讲解

    联想笔记本电脑散热风扇维护和更换步骤如下:1.准备工作包括准备工具、确认风扇型号并选择合适环境;2.断电后拆卸后盖,小心打开卡扣并定位风扇;3.断开电源线后拆卸旧风扇,清洁或更换新风扇;4.如需更换硅脂,清理旧硅脂并涂抹新硅脂;5.重新安装后盖并拧紧螺丝,连接电源测试运行。注意事项包括操作轻柔、记录…

    2026年10月19日 • 用户投稿
    100
  • 用SEMrush优化国际化SEO

    用SEMrush优化国际化SEO用SEMrush优化国际化SEO用SEMrush优化国际化SEO用SEMrush优化国际化SEO

    在拓展全球市场的过程中,越来越多企业依赖谷歌及国际化SEO策略来提升海外曝光。其中,SEMrush作为核心分析工具,能够深入洞察网站的国际化表现。掌握其关键功能,有助于系统优化多语言站点,增强国际搜索可见性。 1、识别并修复hreflang标签问题 2、利用SEMrush站点审计模块中的“国际化SE…

    2026年10月19日 • 用户投稿
    200
  • VSCode用户与工作区设置的区别及最佳实践

    VSCode用户与工作区设置的区别及最佳实践VSCode用户与工作区设置的区别及最佳实践VSCode用户与工作区设置的区别及最佳实践VSCode用户与工作区设置的区别及最佳实践

    用户设置全局生效,适合个性化配置;工作区设置针对单个项目,可覆盖用户设置以满足项目需求。 VSCode 的设置系统分为用户设置和工作区设置,理解它们的区别能帮助你更高效地管理开发环境。用户设置适用于所有项目,而工作区设置只针对当前项目生效。合理使用两者,既能保持个人习惯,又能适配不同项目的特定需求。…

    2026年10月19日 • 用户投稿
    300
  • mac怎么添加桌面小组件_MAC桌面小组件设置方法

    mac怎么添加桌面小组件_MAC桌面小组件设置方法mac怎么添加桌面小组件_MAC桌面小组件设置方法mac怎么添加桌面小组件_MAC桌面小组件设置方法mac怎么添加桌面小组件_MAC桌面小组件设置方法

    首先确保macOS Sonoma已开启桌面小组件功能,通过通知中心编辑并添加所需组件至桌面,启用“在桌面上显示”选项后,可拖动调整位置与尺寸,支持小、中、大三种规格及横向扩展,同时可通过Option+点击桌面快速进入编辑模式,结合方向键与回车键实现快捷操作,提升信息查看效率。 如果您希望在 macO…

    2026年10月19日 • 用户投稿
    300
  • 麻省理工推出可调节的生成 AI 工具,助力机器人虚拟训练

    麻省理工学院计算机科学与人工智能实验室(CSAIL)联合丰田研究院近日发布了一项创新的生成式 AI 技术——“可引导场景生成”(steerable scene generation),旨在增强机器人在复杂环境中的学习能力。该工具能够构建高度逼真的虚拟空间,如厨房、客厅和餐厅等室内场景,供研究人员测试…

    2026年10月19日
    000
  • 为什么系统会生成config.msi临时文件 config.msi在更新卸载过程中的重要作用

    为什么系统会生成config.msi临时文件 config.msi在更新卸载过程中的重要作用为什么系统会生成config.msi临时文件 config.msi在更新卸载过程中的重要作用为什么系统会生成config.msi临时文件 config.msi在更新卸载过程中的重要作用为什么系统会生成config.msi临时文件 config.msi在更新卸载过程中的重要作用

    config.msi是windows installer在安装、更新或卸载软件时创建的临时文件,用于记录操作过程以便回滚或恢复;其主要作用包括事务管理、维护模式、卸载支持和版本控制;安装完成后通常自动删除,若残留可能是因安装错误、服务故障或权限问题;处理方法为重启windows installer服…

    2026年10月19日 • 用户投稿
    000
  • VS Code语言特性:括号着色与智能选择配置指南

    VS Code语言特性:括号着色与智能选择配置指南VS Code语言特性:括号着色与智能选择配置指南VS Code语言特性:括号着色与智能选择配置指南VS Code语言特性:括号着色与智能选择配置指南

    括号着色与智能选择功能可提升VS Code编码效率,通过设置启用括号配对彩色显示和快捷键扩展选中代码块,结合语言支持与主题自定义,增强代码结构识别。 Visual Studio Code(简称 VS Code)作为广受欢迎的代码编辑器,提供了丰富的语言特性来提升编码效率。其中,括号着色与智能选择是两…

    2026年10月19日 • 用户投稿
    000
  • java怎么使用RabbitMQ 连接RabbitMQ实现消息队列通信

    java怎么使用RabbitMQ 连接RabbitMQ实现消息队列通信java怎么使用RabbitMQ 连接RabbitMQ实现消息队列通信java怎么使用RabbitMQ 连接RabbitMQ实现消息队列通信java怎么使用RabbitMQ 连接RabbitMQ实现消息队列通信

    Java通过amqp-client库连接RabbitMQ,先创建ConnectionFactory配置主机、端口、用户名密码,再用newConnection()建立连接并创建Channel;生产者调用queueDeclare()声明队列后,使用basicPublish()发送消息;消费者同样声明队列…

    2026年10月19日 • 用户投稿
    600
  • c盘不能扩展卷怎么办 分享3种方法

    c盘不能扩展卷怎么办 分享3种方法c盘不能扩展卷怎么办 分享3种方法c盘不能扩展卷怎么办 分享3种方法c盘不能扩展卷怎么办 分享3种方法

    电脑使用时间一长,c盘空间不足成了许多用户头疼的常见问题。当你进入磁盘管理,想要通过「扩展卷」来扩大c盘容量时,却发现该功能显示为灰色,无法点击?别急,本文将一步步教你解决“c盘无法扩展卷”的难题,并提供多种实用的扩容方案。 一、为什么C盘无法进行扩展卷? 缺少相邻的未分配空间: 扩展卷功能仅支持将…

    2026年10月19日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信