Java 小抄|解析 JSON 并提取特定层级数据

文章目录

前言

在日常开发中,我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据,并通过流式处理提取特定层级的数据。我们将以一个具体的例子来说明这一过程。

环境准备

依赖库

本文使用了以下依赖库:

  • Gson: 用于 JSON 解析。
  • Lombok: 用于简化 Java 类的编写。

pom.xml 文件中添加以下依赖:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

示例代码

JSON 数据

假设我们有以下 JSON 数据,表示多个预算条目及其子条目:

json 复制代码
[
    {
        "id": 1309,
        "code": "BD000020",
        "level": 1,
        "children": [
            {
                "id": 1664,
                "code": "BD000020001",
                "level": 2,
                "children": [
                    {
                        "id": 1665,
                        "code": "BD000020001001",
                        "level": 3
                    }
                ]
            }
        ]
    },
    {
        "id": 1226,
        "code": "BD000014",
        "level": 1,
        "children": [
            {
                "id": 1227,
                "code": "BD000014001",
                "level": 2,
                "children": [
                    {
                        "id": 1229,
                        "code": "BD000014001001",
                        "level": 3
                    }
                ]
            },
            {
                "id": 1228,
                "code": "BD000014002",
                "level": 2,
                "children": [
                    {
                        "id": 1230,
                        "code": "BD000014002001",
                        "level": 3
                    }
                ]
            }
        ]
    }
]

Java 类定义

首先,我们需要定义一个 Java 类来表示预算条目。这里使用 Lombok 的 @Data 注解来简化类的编写。

java 复制代码
import lombok.Data;

@Data
class Budget {
    private String code;
    private Integer level;
    private List<Budget> children;
}

解析 JSON 数据

接下来,我们使用 Gson 库将 JSON 字符串解析为 List<Budget> 对象。

java 复制代码
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;

public class Level {
    private static String json = "[...]" // 上述 JSON 数据

    public static void main(String[] args) {
        // 将 jsonString 转成 List<Budget> 对象
        Gson gson = new Gson();
        List<Budget> budgets = gson.fromJson(json, new TypeToken<List<Budget>>() {}.getType());
        System.out.println(budgets);

        // 通过 stream 获取 budget 中所有 level=3 的 code
        List<String> codes = budgets.stream()
                .flatMap(budget -> getCodesWithLevelThree(budget))
                .collect(Collectors.toList());
        System.out.println(codes);
    }

    private static Stream<String> getCodesWithLevelThree(Budget budget) {
        if (budget.getLevel() == 3) {
            return Stream.of(budget.getCode());
        } else if (budget.getChildren() != null) {
            return budget.getChildren().stream().flatMap(Level::getCodesWithLevelThree);
        }
        return Stream.empty();
    }
}

代码解释

  1. 解析 JSON 数据:

    • 使用 Gson 库将 JSON 字符串解析为 List<Budget> 对象。
    • TypeToken 用于指定泛型类型。
  2. 提取特定层级的数据:

    • 使用 Stream API 递归地遍历每个预算条目及其子条目。
    • getCodesWithLevelThree 方法检查当前条目的层级是否为 3,如果是,则返回其代码;否则,递归处理其子条目。
  3. 输出结果:

    • 打印解析后的 List<Budget> 对象。
    • 打印所有层级为 3 的代码。

结论

通过本文的示例,我们可以看到使用 Java 和 Gson 库解析 JSON 数据并提取特定层级的数据是非常简单和高效的。希望本文能对大家在实际开发中处理类似问题提供帮助。

相关推荐
IT古董37 分钟前
第四章:大模型(LLM)】06.langchain原理-(3)LangChain Prompt 用法
java·人工智能·python
轻抚酸~4 小时前
小迪23年-32~40——java简单回顾
java·web安全
Sirius Wu6 小时前
Maven环境如何正确配置
java·maven
健康平安的活着7 小时前
java之 junit4单元测试Mockito的使用
java·开发语言·单元测试
Java小白程序员7 小时前
Spring Framework :IoC 容器的原理与实践
java·后端·spring
xuTao6677 小时前
Easy Rules 规则引擎详解
java·easy rules
m0_480502648 小时前
Rust 入门 KV存储HashMap (十七)
java·开发语言·rust
杨DaB9 小时前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
YA3339 小时前
java基础(九)sql基础及索引
java·开发语言·sql
桦说编程9 小时前
方法一定要有返回值 \ o /
java·后端·函数式编程