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

- 一个 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 类,这是进行所有转换的核心。

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 处理任务。

添加 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,JSONArray或JSONObject。- 这种方法比前两种稍微“手动”一些,但原理清晰,不需要
TypeToken。
使用 Java 标准库 (不推荐,仅作了解)
从 Java 11 开始,标准库中引入了 javax.json 包,但它并不是默认包含的,需要额外引入依赖,且功能不如 Jackson 和 Gson 强大和方便。
不推荐的原因:
- 非默认:需要额外引入
jakarta.json依赖。 - API 繁琐:API 设计不如 Jackson/Gson 友好,代码量更多。
- 功能有限:缺少很多高级特性。
如果你没有使用任何第三方库,并且环境非常受限,可以考虑它,否则强烈建议使用 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 是一个绝佳的选择。
选择哪一个主要取决于你的项目需求、团队熟悉度以及已有的技术栈。
