杰瑞科技汇

Java List与JSON如何高效转换?

准备工作:添加依赖

你需要在你的项目中添加相应的库依赖。

Java List与JSON如何高效转换?-图1
(图片来源网络,侵删)

如果使用 Maven (pom.xml)

Jackson (推荐)

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

Gson

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

如果使用 Gradle (build.gradle)

Jackson

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'

Gson

Java List与JSON如何高效转换?-图2
(图片来源网络,侵删)
implementation 'com.google.code.gson:gson:2.10.1'

List 转换为 JSON 字符串

假设我们有一个 User 对象的列表。

定义一个简单的 Java Bean (POJO)

// User.java
public class User {
    private String name;
    private int age;
    private String email;
    // 必须有无参构造函数,Jackson 和 Gson 在反序列化时会用到
    public User() {
    }
    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    // 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 getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    // (可选) 重写 toString() 方便打印和调试
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

使用 Jackson 进行转换

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;
public class ListToJsonJackson {
    public static void main(String[] args) {
        // 1. 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        // 2. 创建一个 User 对象的 List
        List<User> userList = Arrays.asList(
                new User("Alice", 30, "alice@example.com"),
                new User("Bob", 24, "bob@example.com"),
                new User("Charlie", 35, "charlie@example.com")
        );
        try {
            // 3. 将 List 转换为 JSON 字符串
            // objectMapper.writeValueAsString() 可以直接转换任何 Java 对象
            String jsonString = objectMapper.writeValueAsString(userList);
            // 4. 打印结果
            System.out.println("Jackson: List -> JSON");
            System.out.println(jsonString);
            // 输出:
            // [
            //   {"name":"Alice","age":30,"email":"alice@example.com"},
            //   {"name":"Bob","age":24,"email":"bob@example.com"},
            //   {"name":"Charlie","age":35,"email":"charlie@example.com"}
            // ]
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

使用 Gson 进行转换

import com.google.gson.Gson;
import java.util.Arrays;
import java.util.List;
public class ListToJsonGson {
    public static void main(String[] args) {
        // 1. 创建 Gson 实例
        Gson gson = new Gson();
        // 2. 创建一个 User 对象的 List
        List<User> userList = Arrays.asList(
                new User("Alice", 30, "alice@example.com"),
                new User("Bob", 24, "bob@example.com"),
                new User("Charlie", 35, "charlie@example.com")
        );
        // 3. 将 List 转换为 JSON 字符串
        // gson.toJson() 可以直接转换任何 Java 对象
        String jsonString = gson.toJson(userList);
        // 4. 打印结果
        System.out.println("Gson: List -> JSON");
        System.out.println(jsonString);
        // 输出:
        // [{"name":"Alice","age":30,"email":"alice@example.com"},{"name":"Bob","age":24,"email":"bob@example.com"},{"name":"Charlie","age":35,"email":"charlie@example.com"}]
    }
}

JSON 字符串转换为 List

现在我们有一个 JSON 字符串,需要将其转换回 List<User>

使用 Jackson 进行转换

Jackson 在将 JSON 转换为 List 时,需要使用 TypeReference 来明确指定泛型的类型,否则它默认会转换成 ListLinkedHashMap

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JsonToListJackson {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = "[\n" +
                "  {\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},\n" +
                "  {\"name\":\"Bob\",\"age\":24,\"email\":\"bob@example.com\"}\n" +
                "]";
        try {
            // 使用 TypeReference 来明确指定目标类型为 List<User>
            List<User> userList = objectMapper.readValue(jsonString, new TypeReference<List<User>>() {});
            // 打印结果
            System.out.println("Jackson: JSON -> List");
            userList.forEach(System.out::println);
            // 输出:
            // User{name='Alice', age=30, email='alice@example.com'}
            // User{name='Bob', age=24, email='bob@example.com'}
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 Gson 进行转换

Gson 的 fromJson 方法可以直接使用 User[].class 作为参数,因为 Gson 可以从数组类型推断出 List<User> 的类型。

Java List与JSON如何高效转换?-图3
(图片来源网络,侵删)
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class JsonToListGson {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String jsonString = "[\n" +
                "  {\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},\n" +
                "  {\"name\":\"Bob\",\"age\":24,\"email\":\"bob@example.com\"}\n" +
                "]";
        // 方法一:使用数组类型 (推荐)
        // Gson 会自动将数组转换为 List
        List<User> userList1 = gson.fromJson(jsonString, User[].class);
        System.out.println("Gson (数组方式): JSON -> List");
        userList1.forEach(System.out::println);
        // 方法二:使用 TypeToken (更灵活,适用于复杂泛型)
        // 这是 Gson 中处理泛型的标准方式
        Type userListType = new TypeToken<List<User>>(){}.getType();
        List<User> userList2 = gson.fromJson(jsonString, userListType);
        System.out.println("\nGson (TypeToken方式): JSON -> List");
        userList2.forEach(System.out::println);
    }
}

特性 Jackson Gson
依赖 jackson-databind gson
List -> JSON objectMapper.writeValueAsString(list) gson.toJson(list)
JSON -> List objectMapper.readValue(json, new TypeReference<List<T>>() {}); gson.fromJson(json, new TypeToken<List<T>>() {}.getType());
或者 gson.fromJson(json, T[].class)
性能 通常更快,功能更强大,是 Spring Boot 的默认选择。 速度稍慢,但 API 简单直观,非常稳定。
易用性 对于复杂泛型类型,需要 TypeReference,稍显繁琐。 API 非常简洁,对于常用场景非常容易上手。
灵活性 提供了丰富的 API,如流式 API、树模型等,功能更全面。 主要专注于序列化和反序列化,功能相对专注。

如何选择?

  • 新项目,特别是基于 Spring Boot 的项目强烈推荐 Jackson,它是 Spring 框架生态系统的默认选择,集成度高,性能优秀。
  • Android 开发推荐 Gson,Google 官方出品,在 Android 环境中表现稳定,并且不需要额外的依赖配置(在较新的 Android 版本中,Gson 已被移出标准库,但仍需手动添加)。
  • 简单项目或个人项目:两者都可以,Gson 的 API 可能更简单一些,Jackson 的功能更强大,但学习曲线也稍高一点。

希望这份详细的指南能帮助你!

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