java 把对象转化为json字符串

在 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:存在已知安全漏洞。
  • 封装工具类:统一处理日期、空值等逻辑,提升可维护性。
  • 注意字段控制:使用注解控制序列化行为,避免敏感信息泄露。

根据你的项目类型和依赖环境选择合适的库,并始终注意安全性与可维护性。

相关推荐
yuki_uix7 小时前
CSS 里的"结界":BFC 与层叠上下文的渲染隔离逻辑
前端·面试
说实话起个名字真难啊7 小时前
2026数字中国创新大赛数字安全赛道writeup之web题目一
java·前端·安全
后端AI实验室7 小时前
我用AI把一个外包需求从30天压到5天交付,然后客户说:下次还找你
java·ai
biubiubiu07067 小时前
ChatModel 与 ChatClient 关系完整指南
java
jerrywus7 小时前
Claude Code 真正的用法:skill / agent / hooks / worktree 一篇全搞定
前端·agent·claude
ZC跨境爬虫7 小时前
3D 地球卫星轨道可视化平台开发 Day9(AI阈值调控+小众卫星识别+低Token测试模式实战)
人工智能·python·3d·信息可视化·json
陈健平7 小时前
AI漫剧工具复刻实战:用 React Flow 搭一个前端的无限画布,复刻 TapNow / LiblibTV 的核心交互
前端·人工智能·react.js
0xDevNull7 小时前
Java 深度解析:for 循环 vs Stream.forEach 及性能优化指南
java·开发语言·性能优化
博风7 小时前
在tomcat应用里添加了一个线程池对象,向这个线程池发送任务,让其执行。 我希望在tomcat停机时,能等待线程池里的任务执行完了再停机,要如何实现?
java·tomcat