杰瑞科技汇

Java中JSON与String如何互转?

准备工作:添加依赖

你需要在你的项目中添加相应库的依赖,如果你使用 Maven 或 Gradle,可以按以下方式添加。

Java中JSON与String如何互转?-图1
(图片来源网络,侵删)

Jackson (推荐)

Jackson 是目前 Java 生态中最流行、性能最好的 JSON 库。

Maven 依赖:

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

Google Gson

Gson 是 Google 开发的,非常易于使用,API 设计简洁。

Maven 依赖:

Java中JSON与String如何互转?-图2
(图片来源网络,侵删)
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>

Alibaba Fastjson

Fastjson 是阿里巴巴开源的,解析速度极快,但在过去版本中存在一些安全漏洞,目前新版本已修复,但仍需谨慎使用。

Maven 依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.40</version> <!-- 强烈建议使用 2.x 版本 -->
</dependency>

示例:Java 对象、JSON 字符串 和 JSON 互相转换

我们用一个 User 类作为示例。

// User.java
public class User {
    private String name;
    private int age;
    private String[] hobbies;
    // 无参构造函数是必须的,用于反序列化
    public User() {
    }
    // 有参构造函数
    public User(String name, int age, String[] hobbies) {
        this.name = name;
        this.age = age;
        this.hobbies = hobbies;
    }
    // Getter 和 Setter 是必须的,用于序列化和反序列化
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public String[] getHobbies() { return hobbies; }
    public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
    // 重写 toString() 方便打印对象内容
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hobbies=" + Arrays.toString(hobbies) +
                '}';
    }
}

Jackson 示例

Jackson 的核心类是 ObjectMapper

Java中JSON与String如何互转?-图3
(图片来源网络,侵删)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class JacksonExample {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        // 1. Java 对象 -> JSON 字符串
        User user = new User("张三", 30, new String[]{"阅读", "游泳"});
        String jsonString = objectMapper.writeValueAsString(user);
        System.out.println("Java 对象 -> JSON 字符串:");
        System.out.println(jsonString);
        // 输出: {"name":"张三","age":30,"hobbies":["阅读","游泳"]}
        // 2. JSON 字符串 -> Java 对象
        User userFromJson = objectMapper.readValue(jsonString, User.class);
        System.out.println("\nJSON 字符串 -> Java 对象:");
        System.out.println(userFromJson);
        // 输出: User{name='张三', age=30, hobbies=[阅读, 游泳]}
        // 3. JSON 字符串 -> Java List
        String jsonArrayString = "[{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"游戏\"]},{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"音乐\",\"电影\"]}]";
        List<User> userList = objectMapper.readValue(jsonArrayString, new TypeReference<List<User>>() {});
        System.out.println("\nJSON 字符串 -> Java List:");
        userList.forEach(System.out::println);
        /* 输出:
        User{name='李四', age=25, hobbies=[游戏]}
        User{name='王五', age=28, hobbies=[音乐, 电影]}
        */
        // 4. JSON 字符串 -> Java Map
        String jsonMapString = "{\"key1\":\"value1\",\"key2\":123}";
        Map<String, Object> map = objectMapper.readValue(jsonMapString, new TypeReference<Map<String, Object>>() {});
        System.out.println("\nJSON 字符串 -> Java Map:");
        System.out.println(map);
        // 输出: {key1=value1, key2=123}
    }
}

Gson 示例

Gson 的核心类是 Gson,使用非常直观。

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class GsonExample {
    public static void main(String[] args) {
        Gson gson = new Gson();
        // 1. Java 对象 -> JSON 字符串
        User user = new User("张三", 30, new String[]{"阅读", "游泳"});
        String jsonString = gson.toJson(user);
        System.out.println("Java 对象 -> JSON 字符串:");
        System.out.println(jsonString);
        // 输出: {"name":"张三","age":30,"hobbies":["阅读","游泳"]}
        // 2. JSON 字符串 -> Java 对象
        User userFromJson = gson.fromJson(jsonString, User.class);
        System.out.println("\nJSON 字符串 -> Java 对象:");
        System.out.println(userFromJson);
        // 输出: User{name='张三', age=30, hobbies=[阅读, 游泳]}
        // 3. JSON 字符串 -> Java List
        String jsonArrayString = "[{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"游戏\"]},{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"音乐\",\"电影\"]}]";
        // 需要使用 TypeToken 来处理泛型集合
        List<User> userList = gson.fromJson(jsonArrayString, new TypeToken<List<User>>() {}.getType());
        System.out.println("\nJSON 字符串 -> Java List:");
        userList.forEach(System.out::println);
        /* 输出:
        User{name='李四', age=25, hobbies=[游戏]}
        User{name='王五', age=28, hobbies=[音乐, 电影]}
        */
        // 4. JSON 字符串 -> Java Map
        String jsonMapString = "{\"key1\":\"value1\",\"key2\":123}";
        Map<String, Object> map = gson.fromJson(jsonMapString, new TypeToken<Map<String, Object>>() {}.getType());
        System.out.println("\nJSON 字符串 -> Java Map:");
        System.out.println(map);
        // 输出: {key1=value1, key2=123}
    }
}

Fastjson 示例

Fastjson 的 API 非常简洁,但需要注意版本 2.x 的 API 与 1.x 有较大不同,这里使用 Fastjson 2.x

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class FastjsonExample {
    public static void main(String[] args) {
        // 1. Java 对象 -> JSON 字符串
        User user = new User("张三", 30, new String[]{"阅读", "游泳"});
        String jsonString = JSON.toJSONString(user);
        System.out.println("Java 对象 -> JSON 字符串:");
        System.out.println(jsonString);
        // 输出: {"name":"张三","age":30,"hobbies":["阅读","游泳"]}
        // 2. JSON 字符串 -> Java 对象
        User userFromJson = JSON.parseObject(jsonString, User.class);
        System.out.println("\nJSON 字符串 -> Java 对象:");
        System.out.println(userFromJson);
        // 输出: User{name='张三', age=30, hobbies=[阅读, 游泳]}
        // 3. JSON 字符串 -> Java List
        String jsonArrayString = "[{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"游戏\"]},{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"音乐\",\"电影\"]}]";
        // 使用 TypeReference 处理复杂类型
        List<User> userList = JSON.parseObject(jsonArrayString, new TypeReference<List<User>>() {}.getType());
        System.out.println("\nJSON 字符串 -> Java List:");
        userList.forEach(System.out::println);
        /* 输出:
        User{name='李四', age=25, hobbies=[游戏]}
        User{name='王五', age=28, hobbies=[音乐, 电影]}
        */
        // 4. JSON 字符串 -> Java Map
        String jsonMapString = "{\"key1\":\"value1\",\"key2\":123}";
        Map<String, Object> map = JSON.parseObject(jsonMapString, new TypeReference<Map<String, Object>>() {}.getType());
        System.out.println("\nJSON 字符串 -> Java Map:");
        System.out.println(map);
        // 输出: {key1=value1, key2=123}
    }
}

总结与对比

特性 Jackson Gson Fastjson (2.x)
性能 非常高,业界标杆 高,但略逊于 Jackson 极高,号称最快
易用性 API 功能强大但略显复杂,泛型处理需 TypeReference 非常简单直观,API 设计优雅 API 极其简洁,易用性高
生态 最成熟,Spring Framework 默认使用 成熟稳定,社区广泛 阿里巴巴生态,国内使用广泛
功能 功能全面,支持流式处理、树模型等 功能齐全,专注于 JSON 转换 功能强大,支持 JSON, JSONB 等
安全性 相对安全,社区活跃修复问题 相对安全 x 版本曾爆出高危漏洞,x 版本已修复,但仍需关注
推荐场景 首选,特别是大型项目、对性能要求高的项目、Spring 生态项目 新手友好,中小型项目,追求简洁 API 的项目 对性能有极致要求,且能接受其背景风险的国内项目

如何选择?

  • 如果你不确定用哪个,或者正在使用 Spring Boot,请选择 Jackson。 它是事实上的标准,性能和生态都无可挑剔。
  • 如果你是个人项目、小型应用,或者希望代码尽可能简单,可以选择 Gson。 它的 API 非常友好,学习曲线平缓。
  • 如果你在阿里巴巴的技术栈中工作,或者对 JSON 解析速度有极致的追求(例如处理海量数据),可以考虑 Fastjson 2.x。 但请务必使用最新版本,并关注其安全公告。

希望这个详细的解释和示例能帮助你理解如何在 Java 中进行 JSON 和 String 的转换!

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