杰瑞科技汇

Java JSON转Map,怎么转?

核心概念

JSON (JavaScript Object Notation) 的结构天然类似于 Java 中的 Map(特别是 HashMap):

Java JSON转Map,怎么转?-图1
(图片来源网络,侵删)
  • 一个 JSON 对象 对应 Java 中的一个 Map<String, Object>
  • JSON 的键(key)总是字符串类型,对应 Map 的键 String
  • JSON 的值(value)可以是多种类型(字符串、数字、布尔值、数组、对象等),对应 Map 的值 Object

我们的目标就是找到一个工具,能自动解析 JSON 字符串,并根据其内容创建一个结构匹配的 Map


使用 Jackson (推荐)

Jackson 是目前 Java 生态中最流行、性能最高的 JSON 处理库之一,Spring Boot 等现代框架都默认使用它。

添加 Maven 依赖

在你的 pom.xml 文件中添加 Jackson 的核心依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>

编写转换代码

Jackson 提供了 ObjectMapper 类,这是进行所有转换的核心。

Java JSON转Map,怎么转?-图2
(图片来源网络,侵删)
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Map;
public class JacksonJsonToMapExample {
    public static void main(String[] args) {
        // 1. 创建 ObjectMapper 实例(推荐全局单例使用)
        ObjectMapper objectMapper = new ObjectMapper();
        // 2. 定义一个 JSON 字符串
        String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"数学\",\"语文\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
        try {
            // 3. 使用 readValue 方法进行转换
            // 第二个参数是告诉 Jackson 我们要转换的目标类型
            // Map.class 是一个“原始”类型,对于复杂的嵌套结构,最好使用 TypeReference
            Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});
            // 4. 打印结果
            System.out.println("转换后的 Map:");
            map.forEach((key, value) -> {
                System.out.println(key + " : " + value + " (类型: " + value.getClass().getSimpleName() + ")");
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码解释

  • ObjectMapper: Jackson 的核心类,负责读取和写入 JSON。
  • objectMapper.readValue(jsonString, ...): 这是将 JSON 字符串读取并反序列化为 Java 对象的方法。
  • new TypeReference<Map<String, Object>>() {}: 这是一个非常关键的技巧,直接使用 Map.class 会丢失泛型信息,导致 Jackson 无法正确处理嵌套的 JSON 对象(它会将其解析为 LinkedHashMap 而不是你期望的 Map)。TypeReference 可以保留完整的泛型类型信息,确保嵌套结构被正确解析。

输出结果

转换后的 Map:
name : 张三 (类型: String)
age : 30 (类型: Integer)
isStudent : false (类型: Boolean)
courses : [数学, 语文] (类型: ArrayList)
address : {city=北京, district=海淀区} (类型: LinkedHashMap)

可以看到,JSON 中的对象(address)被正确地转换为了 LinkedHashMap,数组(courses)被转换为了 ArrayList


使用 Gson (Google)

Gson 是 Google 提供的另一个非常流行的 JSON 库,使用简单直观。

添加 Maven 依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>

编写转换代码

Gson 的用法比 Jackson 更简洁一些。

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Map;
public class GsonJsonToMapExample {
    public static void main(String[] args) {
        // 1. 创建 Gson 实例(同样推荐全局单例)
        Gson gson = new Gson();
        // 2. 定义 JSON 字符串
        String jsonString = "{\"name\":\"李四\",\"age\":25,\"isStudent\":true,\"courses\":[\"英语\",\"物理\"],\"address\":{\"city\":\"上海\",\"district\":\"浦东新区\"}}";
        // 3. 使用 fromJson 方法进行转换
        // 同样,需要使用 TypeToken 来指定目标类型
        Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
        Map<String, Object> map = gson.fromJson(jsonString, mapType);
        // 4. 打印结果
        System.out.println("转换后的 Map:");
        map.forEach((key, value) -> {
            System.out.println(key + " : " + value + " (类型: " + value.getClass().getSimpleName() + ")");
        });
    }
}

代码解释

  • Gson: Gson 的核心类。
  • gson.fromJson(jsonString, mapType): 将 JSON 字符串反序列化为指定的 Java 类型。
  • new TypeToken<Map<String, Object>>() {}.getType(): 和 Jackson 一样,Gson 也需要 TypeToken 来处理复杂的泛型类型。

使用 org.json (标准库之外的轻量级库)

这个库非常轻量,没有其他依赖,适合简单的 JSON 处理任务。

Java JSON转Map,怎么转?-图3
(图片来源网络,侵删)

添加 Maven 依赖

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20251013</version> <!-- 建议使用最新版本 -->
</dependency>

编写转换代码

import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class OrgJsonExample {
    public static void main(String[] args) {
        // 1. 定义 JSON 字符串
        String jsonString = "{\"name\":\"王五\",\"age\":40,\"isStudent\":false,\"courses\":[\"化学\",\"生物\"],\"address\":{\"city\":\"广州\",\"district\":\"天河区\"}}";
        // 2. 将 JSON 字符串创建成 JSONObject 对象
        JSONObject jsonObject = new JSONObject(jsonString);
        // 3. 创建一个新的 Map 并将 JSONObject 的所有键值对放入其中
        Map<String, Object> map = new HashMap<>();
        for (String key : jsonObject.keySet()) {
            // 使用 jsonObject.get(key) 获取值,其类型是 Object
            map.put(key, jsonObject.get(key));
        }
        // 4. 打印结果
        System.out.println("转换后的 Map:");
        map.forEach((key, value) -> {
            System.out.println(key + " : " + value + " (类型: " + value.getClass().getSimpleName() + ")");
        });
    }
}

代码解释

  • JSONObject: 代表一个 JSON 对象。
  • jsonObject.keySet(): 获取 JSON 对象中所有的键。
  • jsonObject.get(key): 根据键获取值,其返回类型是 Object,可以是 String, Integer, Boolean, JSONArrayJSONObject
  • 这种方法比前两种稍微“手动”一些,但原理清晰,不需要 TypeToken

使用 Java 标准库 (不推荐,仅作了解)

从 Java 11 开始,标准库中引入了 javax.json 包,但它并不是默认包含的,需要额外引入依赖,且功能不如 Jackson 和 Gson 强大和方便。

不推荐的原因:

  1. 非默认:需要额外引入 jakarta.json 依赖。
  2. API 繁琐:API 设计不如 Jackson/Gson 友好,代码量更多。
  3. 功能有限:缺少很多高级特性。

如果你没有使用任何第三方库,并且环境非常受限,可以考虑它,否则强烈建议使用 Jackson 或 Gson


总结与对比

特性 Jackson Gson org.json
流行度 ⭐⭐⭐⭐⭐ (非常高,Spring Boot 默认) ⭐⭐⭐⭐⭐ (非常高,Google出品) ⭐⭐⭐ (中等,轻量级)
性能 非常快 非常快 较快
易用性 API 丰富,TypeReference 是关键 API 简洁直观 API 简单,但需要手动遍历
功能 最全面,支持注解、流式处理等 功能全面,支持注解 功能基础,适合简单场景
依赖 需要添加 jackson-databind 需要添加 gson 需要添加 json
推荐场景 新项目、企业级应用、Spring Boot 项目 任何 Java JSON 处理需求 轻量级、无复杂依赖的项目

最终建议

对于绝大多数 Java 项目,Jackson 是首选,如果你已经在使用 Spring Boot,Jackson 已经为你准备好了,无需任何额外配置,直接使用即可。

如果你更喜欢 Google 的产品或者需要一个更简单的 API,Gson 是一个绝佳的选择。

选择哪一个主要取决于你的项目需求、团队熟悉度以及已有的技术栈。

分享:
扫描分享到社交APP
上一篇
下一篇