下面我将介绍几种主流的方法,从最推荐的到不推荐的方法,并提供详细的代码示例。

推荐方法:使用 Jackson
Jackson 是目前 Java 生态中最流行、性能最好的 JSON 处理库之一,它被广泛使用,并且是 Spring Framework 的默认 JSON 库。
添加依赖
你需要将 Jackson 库添加到你的项目中。
Maven (pom.xml):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
Gradle (build.gradle):

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2' // 建议使用最新版本
代码示例
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 字符串
// 注意:JSON 的键(key)必须是字符串类型,所以转换后的 Map 的 Key 类型是 String
String jsonString = "{\"name\":\"张三\",\"age\":30,\"city\":\"北京\",\"isStudent\":false}";
try {
// 3. 使用 objectMapper.readValue() 进行转换
// 第一个参数是 JSON 字符串
// 第二个参数是目标类型的 TypeReference
// new TypeReference<Map<String, Object>>() {} 用于告诉 Jackson 我们想要一个 Map<String, Object>
Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});
// 4. 打印结果
System.out.println("转换成功!");
System.out.println(map.getClass().getName()); // 查看map的具体实现类,通常是 LinkedHashMap
System.out.println(map);
// 5. 访问 map 中的值
System.out.println("Name: " + map.get("name")); // 张三
System.out.println("Age: " + map.get("age")); // 30 (Integer类型)
System.out.println("City: " + map.get("city")); // 北京
System.out.println("IsStudent: " + map.get("isStudent")); // false (Boolean类型)
} catch (IOException e) {
System.err.println("JSON 解析失败!");
e.printStackTrace();
}
}
}
关键点:
ObjectMapper: 核心类,负责读取和写入 JSON。TypeReference: 这是一个非常重要的工具类,因为 Java 的类型擦除,Map.class无法表达Map<String, Object>这种复杂的泛型类型。TypeReference可以绕过这个问题,精确地指定目标类型。- Map 的 Key 类型: JSON 规范要求键必须是字符串,所以转换后的
Map的 Key 类型一定是String。 - Map 的 Value 类型: Value 的类型会根据 JSON 的值自动推断,
"name": "张三"->String"age": 30->Integer"isStudent": false->Boolean"address": { "street": "xxx" }->Map<String, Object>"hobbies": ["reading", "sports"]->List<Object>
其他流行方法
除了 Jackson,还有两个非常优秀的库:Gson 和 Fastjson。
使用 Google Gson
Gson 是 Google 开发的 JSON 库,同样非常流行且易用。

添加依赖
Maven (pom.xml):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>
代码示例
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();
String jsonString = "{\"name\":\"李四\",\"age\":25,\"city\":\"上海\"}";
// 2. 使用 gson.fromJson() 进行转换
// 第二个参数需要使用 TypeToken 来获取具体的类型
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> map = gson.fromJson(jsonString, type);
// 3. 打印结果
System.out.println("转换成功!");
System.out.println(map);
System.out.println("Name: " + map.get("name"));
}
}
关键点:
Gson: 核心类。TypeToken: 与 Jackson 的TypeReference作用完全相同,用于获取泛型类型信息。
使用阿里巴巴 Fastjson
Fastjson 曾经是国内非常流行的 JSON 库,以其高性能著称,但需要注意,其社区版本在安全性和维护性上曾有过一些问题,新项目建议谨慎使用或升级到 2.x 版本。
添加依赖 (以 2.x 版本为例)
Maven (pom.xml):
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.40</version> <!-- 建议使用最新版本 -->
</dependency>
代码示例
Fastjson 的 API 非常简洁。
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import java.util.Map;
public class FastjsonJsonToMapExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"王五\",\"age\":40,\"city\":\"广州\"}";
// Fastjson 的 API 非常直接
Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {});
System.out.println("转换成功!");
System.out.println(map);
System.out.println("Name: " + map.get("name"));
}
}
关键点:
JSON: Fastjson 提供了一个静态工具类JSON,所有方法都通过它调用。TypeReference: 同样需要使用TypeReference来指定目标类型。
不推荐的方法:手动解析(仅用于理解原理)
在没有任何 JSON 库的情况下,你可以尝试手动解析,但这非常繁琐、容易出错,且无法处理复杂的 JSON 结构(如嵌套对象、数组等)。仅用于学习和理解 JSON 格式,不推荐在生产环境中使用。
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ManualJsonToMap {
public static void main(String[] args) {
String jsonString = "{\"name\":\"赵六\",\"age\":35}";
Map<String, String> map = new HashMap<>();
// 这是一个非常简陋的正则表达式,仅适用于特定格式的简单JSON
Pattern pattern = Pattern.compile("\"(\\w+)\":\"?([^\"]*)\"?");
Matcher matcher = pattern.matcher(jsonString);
while (matcher.find()) {
String key = matcher.group(1);
String value = matcher.group(2);
map.put(key, value);
}
System.out.println("手动解析结果(非常不推荐):");
System.out.println(map);
}
}
缺点:
- 无法处理数字、布尔值、
null、嵌套对象和数组。 - 正则表达式极其脆弱,JSON 格式稍有变化就会失败。
- 代码可读性差,维护成本高。
总结与对比
| 特性 | Jackson | Gson | Fastjson (2.x) | 手动解析 |
|---|---|---|---|---|
| 易用性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
| 性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 不适用 |
| 功能丰富度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
| 社区生态 | ⭐⭐⭐⭐⭐ (Spring默认) | ⭐⭐⭐⭐⭐ (Google出品) | ⭐⭐⭐⭐ (国内流行) | 不适用 |
| 推荐度 | 强烈推荐 | 强烈推荐 | 推荐 (注意版本) | 不推荐 |
最终建议
对于任何新的 Java 项目,首选 Jackson,它功能强大、性能卓越、社区活跃,并且是许多主流框架(如 Spring)的默认选择,如果你已经是 Google 技术栈的忠实用户,Gson 也是一个非常不错的选择,除非有特殊的历史原因或性能极致要求,否则优先考虑 Jackson 或 Gson。
