杰瑞科技汇

Java JSON数组如何高效转字符串?

  1. 将一个 Java 对象列表(如 List)转换为 JSON 格式的字符串,这是最常见的需求,通常用于将数据发送给前端或其他服务。
  2. 将一个 JSON 格式的字符串解析(转换)成 Java 对象列表,这是第一种情况的逆操作。

下面我将分别详细介绍这两种情况,并提供完整的代码示例。

Java JSON数组如何高效转字符串?-图1
(图片来源网络,侵删)

将 Java 对象列表(List)转为 JSON 字符串

要实现这个功能,我们需要一个 JSON 处理库,目前最流行和推荐的是 JacksonGson

方法 1:使用 Jackson (推荐)

Jackson 是一个功能强大、性能极高的 JSON 处理库,是 Spring Boot 等框架的默认选择。

添加依赖

如果你使用 Maven,在 pom.xml 中添加:

Java JSON数组如何高效转字符串?-图2
(图片来源网络,侵删)
<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' // 使用最新版本

创建 Java 类

你需要一个 Java 类来表示 JSON 数组中的对象。

// User.java
public class User {
    private String name;
    private int age;
    private String email;
    // 无参构造器是 Jackson 反序列化时需要的
    public User() {
    }
    // 带参构造器方便创建对象
    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    // Getter 和 Setter 是 Jackson 序列化和反序列化必需的
    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 + '\'' +
                '}';
    }
}

执行转换

Java JSON数组如何高效转字符串?-图3
(图片来源网络,侵删)

使用 Jackson 的 ObjectMapperList<User> 转换为 JSON 字符串。

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class JacksonListToJson {
    public static void main(String[] args) {
        // 1. 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        // 2. 创建一个 User 对象列表
        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() 是最直接的方法
            String jsonString = objectMapper.writeValueAsString(userList);
            // 4. 输出结果
            System.out.println(jsonString);
            // 如果你想要格式化(美化)输出,可以使用 writerWithDefaultPrettyPrinter()
            String prettyJsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(userList);
            System.out.println("\n美化后的 JSON:");
            System.out.println(prettyJsonString);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出结果:

[{"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:
[
  {
    "name" : "Alice",
    "age" : 30,
    "email" : "alice@example.com"
  },
  {
    "name" : "Bob",
    "age" : 24,
    "email" : "bob@example.com"
  },
  {
    "name" : "Charlie",
    "age" : 35,
    "email" : "charlie@example.com"
  }
]

方法 2:使用 Google Gson

Gson 是 Google 开发的另一个非常流行的 JSON 库,使用起来同样非常方便。

添加依赖

Maven (pom.xml):

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

Gradle (build.gradle):

implementation 'com.google.code.gson:gson:2.10.1' // 使用最新版本

执行转换

Gson 的使用非常直观,直接创建 Gson 实例并调用 toJson() 方法。

import com.google.gson.Gson;
import java.util.Arrays;
import java.util.List;
public class GsonListToJson {
    public static void main(String[] args) {
        // 1. 创建 Gson 实例
        Gson gson = new Gson();
        // 2. 创建 User 对象列表 (User 类与上面 Jackson 示例中的相同)
        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 字符串
        String jsonString = gson.toJson(userList);
        // 4. 输出结果
        System.out.println(jsonString);
        // Gson 默认不提供美化输出的方法,但可以通过 GsonBuilder 实现
        Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
        String prettyJsonString = prettyGson.toJson(userList);
        System.out.println("\n美化后的 JSON:");
        System.out.println(prettyJsonString);
    }
}

输出结果:

与 Jackson 的输出格式基本一致。


将 JSON 字符串转为 Java 对象列表

这是上述过程的逆操作,也称为“反序列化”。

使用 Jackson

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonJsonToList {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        // 假设这是从前端或 API 接收到的 JSON 字符串
        String jsonString = "[{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},{\"name\":\"Bob\",\"age\":24,\"email\":\"bob@example.com\"}]";
        try {
            // 关键点:使用 TypeReference 来告诉 Jackson 目标集合的具体类型
            // 如果直接写 List.class,Jackson 无法知道 List 里面装的是什么类型的对象
            List<User> userList = objectMapper.readValue(jsonString, new TypeReference<List<User>>() {});
            // 输出结果进行验证
            System.out.println(userList);
            userList.forEach(System.out::println);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出结果:

[User{name='Alice', age=30, email='alice@example.com'}, User{name='Bob', age=24, email='bob@example.com'}]
User{name='Alice', age=30, email='alice@example.com'}
User{name='Bob', age=24, email='bob@example.com'}

使用 Gson

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonJsonToList {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String jsonString = "[{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},{\"name\":\"Bob\",\"age\":24,\"email\":\"bob@example.com\"}]";
        // 关键点:使用 TypeToken 来获取泛型类型
        Type userListType = new TypeToken<List<User>>() {}.getType();
        List<User> userList = gson.fromJson(jsonString, userListType);
        // 输出结果进行验证
        System.out.println(userList);
        userList.forEach(System.out::println);
    }
}

输出结果:

与 Jackson 的输出结果一致。


总结与对比

特性 Jackson Gson
流行度 非常高,Spring Boot 默认选择 非常高,Google 出品
性能 通常被认为性能更优 性能也非常好,略有差距
API 风格 功能全面,配置复杂度稍高 API 简洁直观,易于上手
核心对象 ObjectMapper Gson
JSON 字符串转 List objectMapper.read(json, new TypeReference<List<T>>(){}) gson.fromJson(json, new TypeToken<List<T>>(){}.getType())
美化输出 objectMapper.writerWithDefaultPrettyPrinter() new GsonBuilder().setPrettyPrinting().create()

如何选择?

  • 如果你正在使用 Spring Boot 或其他 Jakarta EE/Jakarta EE 框架,直接使用 Jackson,因为它已经包含在依赖中,无需额外引入。
  • 如果你需要一个简单、快速、易于集成的解决方案Gson 是一个绝佳的选择,它的 API 对新手非常友好。
  • 如果对性能有极致要求,可以做一些基准测试,但在大多数应用场景下,两者性能差异可以忽略不计。

对于大多数项目来说,两者都是优秀的选择,选择哪一个往往取决于项目的技术栈和个人偏好。

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