在 Java 中将对象转换为 JSON 字符串是开发中的常见需求。以下是四种主流方法的对比与使用示例,帮助你根据项目需求选择合适方案。
1. Jackson(推荐,Spring Boot 默认)
引入依赖
<!-- Maven -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
示例代码
ObjectMapper mapper = new ObjectMapper();
// 对象转 JSON
String json = mapper.writeValueAsString(user);
// 带格式化的 JSON
String prettyJson = mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(user);
// JSON 转对象
User user = mapper.readValue(json, User.class);
// JSON 转 List
List<User> users = mapper.readValue(json,
new TypeReference<List<User>>() {});
常用配置
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
2. Gson(Google 出品)
引入依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
示例代码
Gson gson = new Gson();
// 对象转 JSON
String json = gson.toJson(user);
// 带格式化的 JSON
String prettyJson = new GsonBuilder().setPrettyPrinting()
.create()
.toJson(user);
// JSON 转对象
User user = gson.fromJson(json, User.class);
// JSON 转 List
List<User> users = gson.fromJson(json,
new TypeToken<List<User>>() {}.getType());
常用配置
Gson gson = new GsonBuilder()
.serializeNulls() // 序列化 null 值
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.disableHtmlEscaping()
.create();
3. Fastjson / Fastjson2(阿里巴巴)
引入依赖
<!-- Fastjson2(推荐,更安全) -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.40</version>
</dependency>
示例代码
// 对象转 JSON
String json = JSON.toJSONString(user);
// 带格式化的 JSON
String prettyJson = JSON.toJSONString(user,
JSONWriter.Feature.PrettyFormat);
// JSON 转对象
User user = JSON.parseObject(json, User.class);
// JSON 转 List
List<User> users = JSON.parseArray(json, User.class);
常用配置
// 忽略 null 值
String json = JSON.toJSONString(user,
JSONWriter.Feature.WriteMapNullValue);
⚠️ 注意:Fastjson 1.x 存在安全漏洞,建议使用 Fastjson2 或避免使用。
4. JSON-B(Java 标准,较少用)
引入依赖
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>yasson</artifactId>
<version>2.0.2</version>
</dependency>
示例代码
Jsonb jsonb = JsonbBuilder.create();
// 对象转 JSON
String json = jsonb.toJson(user);
// JSON 转对象
User user = jsonb.fromJson(json, User.class);
5. 方法对比
| 特性 | Jackson | Gson | Fastjson2 | JSON-B |
|---|---|---|---|---|
| 性能 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 安全性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐(2.x) | ⭐⭐⭐⭐⭐ |
| Spring 集成 | ✅ 默认支持 | ❌ | ❌ | ❌ |
| 功能丰富度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 社区活跃度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
6. 最佳实践建议
✅ 推荐工具类封装(以 Jackson 为例)
@Component
public class JsonUtil {
private static final ObjectMapper mapper = new ObjectMapper();
static {
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
}
public static String toJson(Object obj) {
try {
return mapper.writeValueAsString(obj);
} catch (Exception e) {
throw new RuntimeException("JSON 转换失败", e);
}
}
public static <T> T fromJson(String json, Class<T> clazz) {
try {
return mapper.readValue(json, clazz);
} catch (Exception e) {
throw new RuntimeException("JSON 解析失败", e);
}
}
}
✅ 控制字段序列化
public class User {
@JsonIgnore // 不序列化
private String password;
@JsonProperty("user_name") // 自定义字段名
private String name;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
✅ 处理日期时间
// Java 8+ 推荐
private LocalDateTime createTime;
// 配置
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
7. 选择建议
| 场景 | 推荐方案 |
|---|---|
| Spring Boot 项目 | ✅ Jackson(默认) |
| 对性能要求高 | ✅ Fastjson2 |
| Android 项目 | ✅ Gson |
| 需要 Java 标准兼容 | ✅ JSON-B |
| 通用、安全、稳定 | ✅ Jackson |
总结
- 首选 Jackson:Spring Boot 默认集成,功能强大、社区活跃、安全性高。
- 避免使用 Fastjson 1.x:存在已知安全漏洞。
- 封装工具类:统一处理日期、空值等逻辑,提升可维护性。
- 注意字段控制:使用注解控制序列化行为,避免敏感信息泄露。
根据你的项目类型和依赖环境选择合适的库,并始终注意安全性与可维护性。