java怎么遍历json

在 Java 中,可借助 Jackson、Gson 等库将 JSON 转为 Map 或 List,通过迭代器或 for 循环遍历其键值对来

在Java中遍历JSON数据是开发过程中常见的需求,尤其在与前后端交互、配置文件解析或数据处理场景中频繁出现,由于Java本身不提供内置的JSON解析器,开发者通常借助第三方库实现这一功能,以下从核心概念、主流实现方式、典型场景示例、工具对比四个维度展开详解,并附完整代码演示和常见问题解答。

java怎么遍历json


基础认知:JSON的数据形态与遍历本质

JSON(JavaScript Object Notation)是一种轻量级数据交换格式,其核心由两种基本结构组成:
| 类型 | 特征 | 遍历目标 |
|————|———————————————————————-|——————————|
| 对象 | 键值对集合({"name":"张三", "age":25}),无序且允许重复键 | 遍历所有键及对应的值 |
| 数组 | 有序的值序列([1, "a", true]),通过索引访问元素 | 按顺序遍历每个元素 |

实际业务中常遇到混合结构(如对象包含数组,数组元素又是对象),此时需递归或分层遍历,理解这一特性是编写健壮遍历逻辑的关键。


主流实现方案详解

方案1:基于org.json库(轻量化首选)

这是Apache许可的纯Java实现,适合简单场景,核心类为JSONObject(表示对象)和JSONArray(表示数组)。

关键步骤:

  1. 构建JSON实例:可通过字符串构造或读取文件/网络流

    // 从字符串创建
    String jsonStr = "{"users":[{"id":1,"name":"李四"},{"id":2,"name":"王五"}]}";
    JSONObject jsonObj = new JSONObject(jsonStr);
    // 从文件读取(需处理IO异常)
    File file = new File("data.json");
    JSONObject fileJson = new JSONObject(new String(Files.readAllBytes(file.toPath())));
  2. 遍历逻辑:

    • 遍历对象:通过keys()获取所有键,再用get()取值
      Set<String> keys = jsonObj.keySet(); // 获取所有键
      for (String key : keys) {
          Object value = jsonObj.get(key); // 值可能是基本类型/对象/数组
          System.out.println(key + " -> " + value);
      }
    • 遍历数组:通过length()和get(index)逐项访问
      JSONArray userArray = jsonObj.getJSONArray("users");
      for (int i = 0; i < userArray.length(); i++) {
          JSONObject user = userArray.getJSONObject(i);
          System.out.println("用户ID:" + user.getInt("id") + ", 姓名:" + user.getString("name"));
      }
  3. 特殊处理:

    • 判断字段是否存在:has(key)
    • 类型安全获取:getString(), getInt()等方法自动转换类型
    • 嵌套结构处理:若值为JSONObject或JSONArray,可继续调用对应方法深入遍历

优势:无需额外配置,API直观;缺点:复杂场景下代码冗余度高。

java怎么遍历json


方案2:Jackson库(企业级标准)

Jackson是目前最流行的JSON处理库之一,支持流式解析和注解驱动映射,适合高性能和复杂需求。

核心组件:
| 类/接口 | 用途 | 典型用法 |
|——————|—————————————-|———————————–|
| ObjectMapper | 主入口,负责读写操作 | new ObjectMapper().readValue() |
| JsonNode | 抽象节点,可表示任意JSON结构 | traverse()方法实现深度遍历 |
| TypeReference | 解决泛型集合反序列化问题 | 配合readValue()使用 |

遍历实践:

  1. 基础对象遍历:

    ObjectMapper mapper = new ObjectMapper();
    JsonNode rootNode = mapper.readTree(jsonStr); // 转为树形结构
    // 遍历顶层字段
    Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
    while (fields.hasNext()) {
        Map.Entry<String, JsonNode> entry = fields.next();
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }
  2. 数组遍历:

    JsonNode users = rootNode.get("users"); // 假设users是数组
    if (users.isArray()) {
        for (JsonNode user : users) { // Jackson自动迭代数组元素
            System.out.println("用户ID:" + user.get("id").asInt() + ", 姓名:" + user.get("name").asText());
        }
    }
  3. 高级特性:

    • 流式处理:使用JsonParser逐事件读取,内存占用极低,适用于GB级大文件
      JsonParser parser = mapper.createParser(jsonStr);
      while (parser.nextToken() != null) {
          if (parser.currentToken() == FieldName) {
              parser.getText(); // 读取当前字段值
          }
      }
    • POJO映射:将JSON直接映射到Java对象,无需手动遍历
      public class User {
          private int id;
          private String name;
          // getter/setter省略
      }
      List<User> users = mapper.readValue(rootNode.get("users"), new TypeReference<List<User>>(){});

优势:功能强大,支持流式处理、注解配置、复杂类型映射;缺点:学习曲线较陡。


方案3:Gson库(简洁易用)

Google开发的Gson以简洁著称,特别适合快速开发。

java怎么遍历json

核心方法:

  • fromJson():将JSON转为Java对象
  • toJson():将Java对象转为JSON
  • entrySet():遍历Map风格的JSON对象

遍历示例:

Gson gson = new Gson();
JsonElement element = gson.fromJson(jsonStr, JsonElement.class); // 转为通用元素
if (element.isJsonObject()) {
    JsonObject obj = element.getAsJsonObject();
    for (Map.Entry<String, JsonElement> entry : obj.entrySet()) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }
} else if (element.isJsonArray()) {
    JsonArray arr = element.getAsJsonArray();
    for (JsonElement e : arr) {
        System.out.println(e.getAsString()); // 根据实际类型调用getAsXxx()
    }
}

特色功能:

  • 空值处理:serializeNulls()控制是否序列化null值
  • 日期格式化:通过setDateFormat()自定义日期模式
  • 排除字段:使用@Expose注解精细控制序列化行为

方案对比表

维度 org.json Jackson Gson
依赖体积 较小 较大(含模块) 中等
学习成本 低 高 低
性能 一般 最优(尤其流式) 良好
功能丰富度 基础功能 全面(含流式) 实用级
社区支持 活跃 非常活跃 活跃
适用场景 小型项目 大型系统/大数据 快速开发

典型场景解决方案

场景1:未知结构的动态JSON处理

当接收到结构不固定的JSON时,应采用通用节点遍历:

// Jackson实现
JsonNode node = new ObjectMapper().readTree(jsonStr);
processNode(node); // 递归处理子节点
private void processNode(JsonNode node) {
    if (node.isObject()) {
        node.fields().forEachRemaining(entry -> {
            System.out.println("Key: " + entry.getKey());
            processNode(entry.getValue()); // 递归处理嵌套结构
        });
    } else if (node.isArray()) {
        node.forEach(this::processNode); // 递归处理数组元素
    } else {
        System.out.println("Value: " + node.asText());
    }
}

场景2:高性能大文件处理

对于超过100MB的JSON文件,必须使用流式解析:

// Jackson流式处理示例
JsonFactory factory = new JsonFactory();
try (InputStream in = new FileInputStream("large.json")) {
    JsonParser parser = factory.createParser(in);
    while (parser.nextToken() != null) {
        if (parser.currentToken() == FieldName) {
            String fieldName = parser.getCurrentName();
            parser.nextToken(); // 移动到值位置
            String value = parser.getText();
            // 处理字段...
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

常见问题FAQs

Q1: 如何处理JSON中的重复键?

A: 根据JSON规范,对象不允许重复键,若输入包含重复键,不同库的处理方式不同:

  • org.json:后出现的键会覆盖前者
  • Jackson/Gson:默认保留最后一个值,可通过DeserializationFeature.FAIL_ON_DUP_FIELD_NAME(Jackson)或自定义反序列化器调整行为,建议在生成JSON时避免重复键。

Q2: 遇到复杂嵌套结构如何高效遍历?

A: 推荐使用递归算法,结合具体库的特性:

  • Jackson:利用JsonNode的isObject()/isArray()判断类型,递归处理子节点
  • Gson:通过JsonElement的类型检查(isJsonObject()/isJsonArray())实现递归
  • 注意设置最大递归深度防止栈溢出,例如Jackson可通过DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES过滤无关字段。

归纳建议

需求场景 推荐方案 理由
小型项目/快速原型 Gson API简单,学习成本低
企业级应用/大数据 Jackson 性能优异,功能全面
教学/简单演示 org.json 无需复杂配置,直观易懂
需要严格类型校验 Jackson+POJO 编译期类型检查,减少运行时

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/100680.html

赞 (0)
酷盾叔的头像酷盾叔
上一篇 2025年8月10日 17:37
下一篇 2025年8月10日 17:46

相关推荐

  • java文件导出txt文件怎么打开乱码

    Java导出TXT文件乱码多因编码不匹配,需在代码中明确指定编码(如UTF-8),确保写入与打开时编码一致,建议使用支持编码选择的文本编辑器(如Notepad++)或在代码中添加BO

    2025年7月23日
    1500
  • Java实现倒计时功能有哪些具体方法与步骤?

    Java实现倒计时功能,可以通过多种方式完成,以下是一个简单的示例,使用Java中的System.currentTimeMillis()方法来获取当前时间,并计算与目标时间的差值,从而实现倒计时功能,示例代码public class CountdownTimer { public static void mai……

    2025年10月11日
    2000
  • Java批量反编译方法及步骤详解?如何高效实现代码反汇编?

    Java程序在开发过程中,有时需要查看或修改已编译的.class文件,这可以通过反编译工具实现,下面将介绍几种常用的Java批量反编译方法,使用JD-GUI进行批量反编译JD-GUI是一款免费的Java反编译工具,支持批量反编译,步骤:下载并安装JD-GUI,打开JD-GUI,点击“File”菜单,选择“Ope……

    2025年10月15日
    4500
  • Java中pow()函数如何正确使用及其应用场景详解?

    Pow(Proof of Work)算法在Java中实现,主要是用于加密货币的挖矿过程,也可以用于其他需要验证工作量的场景,以下是如何在Java中使用Pow算法的详细步骤:Pow算法在Java中的使用步骤步骤详细说明添加依赖在Java项目中,首先需要添加相应的库,对于Pow算法,可以使用开源库如bitcoinj……

    2025年10月13日
    2500
  • Java后台框架搭建步骤详解与疑问解答汇总?

    Java后台框架搭建是一个涉及多个步骤和技术的复杂过程,以下是一个详细的搭建步骤,包括环境配置、框架选择、项目结构设计、编码实现和测试等环节,环境配置在搭建Java后台框架之前,需要准备以下环境:环境名称版本要求说明JavaJDK 1.8+Java开发工具包,是开发Java应用程序的基础MavenMaven 3……

    2025年9月25日
    3900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN