Java 对象如何优雅地转换为 JSON?全面指南与实践
在现代软件开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准,无论是前后端分离的 Web 应用、微服务架构,还是移动应用与后端的通信,我们都需要将后端语言(如 Java)的数据结构转换为 JSON 格式,以便于前端或其他系统解析和使用,本文将全面介绍在 Java 中将对象转换为 JSON 的多种方法,从最基础的手动拼接,到业界广泛使用的库,助你选择最适合你项目的方案。
为什么需要将 Java 转为 JSON?
在技术细节前,我们首先要明白为什么要做这件事,核心原因在于 数据格式的不匹配:
- Java 的世界:我们使用 POJO(Plain Old Java Object)、List、Map 等复杂的数据结构来组织业务逻辑,这些结构是强类型的、面向对象的,并且可能包含方法。
- 网络的世界:HTTP 协议传输的是文本数据,JSON 是一种轻量级、易于人阅读和编写、也易于机器解析和生成的文本格式。
将 Java 对象序列化(Serialize)为 JSON,就是将内存中的对象状态转换为可传输的字符串形式,反之,将 JSON 字符串反序列化(Deserialize)为 Java 对象,则是将接收到的数据还原为程序可用的对象。
转换方法大盘点
将 Java 转为 JSON 主要有以下几种方式,各有优劣。
手动拼接字符串(不推荐)
这是最原始的方式,适用于极简单的、结构固定的 JSON。
示例:
public class User {
private String name;
private int age;
// ... getters and setters
}
// 在代码中手动拼接
User user = new User();
user.setName("张三");
user.setAge(30);
String jsonString = "{\"name\": \"" + user.getName() + "\", \"age\": " + user.getAge() + "}";
System.out.println(jsonString);
缺点:
- 繁琐且易错:当对象嵌套复杂时,拼接字符串会变得非常麻烦,容易漏掉逗号、引号或大括号。
- 可读性差:代码逻辑被字符串拼接打断,难以维护。
- 性能低下:频繁的字符串拼接会创建大量临时对象,影响性能。
仅用于临时调试或学习,生产环境中应避免使用。
使用 Jackson(业界标准)
Jackson 是目前 Java 生态中最流行、功能最强大的 JSON 处理库,Spring Boot 默认就集成了 Jackson。
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
核心类:ObjectMapper
ObjectMapper 是 Jackson 的核心 API,负责所有的序列化和反序列化工作。
基本使用
确保你的 Java 类有标准的 getter 和 setter(或使用 public 字段),Jackson 通过反射访问这些属性。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) {
// 1. 创建 ObjectMapper 实例 (推荐全局单例使用)
ObjectMapper mapper = new ObjectMapper();
// 2. 创建 Java 对象
User user = new User();
user.setName("李四");
user.setAge(25);
user.setEmail("lisi@example.com");
try {
// 3. 将 Java 对象转换为 JSON 字符串
// 方法一:直接输出,格式紧凑
String jsonStringCompact = mapper.writeValueAsString(user);
System.out.println("紧凑格式: " + jsonStringCompact);
// 输出: {"name":"李四","age":25,"email":"lisi@example.com"}
// 方法二:格式化输出,便于阅读
String jsonStringPretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println("美化格式:\n" + jsonStringPretty);
/* 输出:
{
"name" : "李四",
"age" : 25,
"email" : "lisi@example.com"
}
*/
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
常用注解 Jackson 提供了丰富的注解来控制序列化行为。
-
@JsonIgnore:忽略某个字段,不将其包含在 JSON 中。public class User { private String name; @JsonIgnore private String password; // 密码不会被序列化 // ... } -
@JsonProperty:指定 JSON 中的字段名。public class User { @JsonProperty("user_name") private String name; // ... } // 输出: {"user_name":"李四", ...} -
@JsonFormat:格式化日期。import java.util.Date; public class User { // ... @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; // ... }
使用 Gson(Google 出品)
Gson 是 Google 开发的另一个非常流行的 JSON 库,以其简洁易用而闻名。
添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
核心类:Gson
Gson 类是 Gson 库的入口,非常直观。
基本使用
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
// 1. 创建 Gson 实例
Gson gson = new Gson();
// 2. 创建 Java 对象
User user = new User();
user.setName("王五");
user.setAge(40);
user.setEmail("wangwu@example.com");
// 3. 转换为 JSON
String jsonString = gson.toJson(user);
System.out.println(jsonString);
// 输出: {"name":"王五","age":40,"email":"wangwu@example.com"}
// 4. 美化输出
// Gson 本身不直接提供美化方法,但可以借助 GsonBuilder
Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
String prettyJsonString = prettyGson.toJson(user);
System.out.println("美化格式:\n" + prettyJsonString);
}
}
与 Jackson 的对比
- 简洁性:Gson 的 API 通常比 Jackson 更简单、更少“魔法”。
- 功能:Jackson 功能更强大,特别是与 Spring 框架集成时,提供了
@JsonView等高级特性。 - 性能:两者性能都非常优秀,差异通常可以忽略不计。
使用 org.json(轻量级)
org.json 是一个非常轻量级的库,适合只需要基本 JSON 功能的场景。
添加依赖(Maven)
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version> <!-- 使用最新版本 -->
</dependency>
核心类:JSONObject, JSONArray
这种方式与前面两种不同,它不是直接序列化一个 Java 对象,而是先构建一个 JSONObject,然后再将其转为字符串。
基本使用
import org.json.JSONObject;
public class OrgJsonExample {
public static void main(String[] args) {
// 1. 直接构建 JSONObject
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "赵六");
jsonObject.put("age", 50);
jsonObject.put("isStudent", false);
// 2. 将 JSONObject 转为 JSON 字符串
String jsonString = jsonObject.toString();
System.out.println(jsonString);
// 输出: {"name":"赵六","age":50,"isStudent":false}
// 3. 美化输出
String prettyJsonString = jsonObject.toString(2); // 参数为缩进空格数
System.out.println("美化格式:\n" + prettyJsonString);
}
}
缺点:这种方式需要手动将 Java 对象的属性逐个添加到 JSONObject 中,对于复杂的对象结构,代码量会很大。
如何选择?一张图帮你决策
| 特性 | Jackson | Gson | org.json |
|---|---|---|---|
| 流行度/社区 | 极高,Spring Boot � |



还没有评论,来说两句吧...