杰瑞科技汇

Java中JSON字符串转Map有哪些方法?

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

Java中JSON字符串转Map有哪些方法?-图1
(图片来源网络,侵删)

推荐方法:使用 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):

Java中JSON字符串转Map有哪些方法?-图2
(图片来源网络,侵删)
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 库,同样非常流行且易用。

Java中JSON字符串转Map有哪些方法?-图3
(图片来源网络,侵删)

添加依赖

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。

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