Java Map 接收多层级 JSON

在 Java 开发中,处理 JSON 数据是一项常见的任务。JSON(JavaScript Object Notation)是一种常用的数据交换格式,其结构简单清晰,易于阅读和编写。在实际开发中,我们经常会遇到需要将多层级的 JSON 数据解析成 Java 对象的情况。

Java 提供了多种处理 JSON 数据的库,如 Jackson、Gson 等。其中,使用 Map 来接收多层级的 JSON 数据是一种简单而常见的方法。本文将介绍如何使用 Java Map 来接收和解析多层级的 JSON 数据,并提供相应的代码示例。

1. 引入依赖

首先,我们需要在项目中引入 JSON 数据处理的相关依赖。在本文中,我们使用 Jackson 库作为示例。可以在 Maven 或 Gradle 中添加以下依赖:

Maven 依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.4</version>
</dependency>

Gradle 依赖:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.4'

2. 使用 Map 接收 JSON 数据

假设我们有如下的 JSON 数据:

{
  "name": "John",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "New York"
  },
  "hobbies": ["reading", "swimming"]
}

我们可以使用以下代码将 JSON 数据解析为 Map 对象:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\"},\"hobbies\":[\"reading\",\"swimming\"]}";

        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> data = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});

        // 获取 name 和 age
        String name = (String) data.get("name");
        int age = (int) data.get("age");

        System.out.println("Name: " + name);
        System.out.println("Age: " + age);

        // 获取 address
        Map<String, Object> address = (Map<String, Object>) data.get("address");
        String street = (String) address.get("street");
        String city = (String) address.get("city");

        System.out.println("Street: " + street);
        System.out.println("City: " + city);

        // 获取 hobbies
        List<String> hobbies = (List<String>) data.get("hobbies");

        System.out.println("Hobbies: " + hobbies);
    }
}

在上述代码中,我们使用 ObjectMapper 类将 JSON 数据解析为 Map<String, Object> 对象。首先,我们获取顶层字段(如 name 和 age),然后使用相应的类型转换获取嵌套字段(如 address 和 hobbies)。

运行上述代码将输出以下结果:

Name: John
Age: 30
Street: 123 Main St
City: New York
Hobbies: [reading, swimming]

3. 深层次的 JSON 数据

如果 JSON 数据更加复杂,包含多个嵌套层次的字段,我们可以通过递归的方式解析它们。以下是一个示例:

public class JsonExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"country\":{\"name\":\"USA\",\"code\":\"US\"}},\"hobbies\":[\"reading\",\"swimming\"]}";

        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> data = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});

        printData(data);
    }

    private static void printData(Map<String, Object> data) {
        for (Map.Entry<String, Object> entry : data.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();

            if (value instanceof Map) {
                System.out.println("Key: " + key);
                printData((Map<String, Object>) value);
            } else if (value instanceof List) {
                System.out.println("Key: " + key);
                for (Object item : (List) value) {
                    if (item instanceof Map) {
                        printData((Map<String, Object>) item);
                    } else {
                        System.out.println("Value: " + item);
                    }
                }
            } else