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

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

相关推荐
葡萄城技术团队5 分钟前
SpreadJS V19.2 新特性揭秘:FILTERXML 函数
前端
醉颜凉12 分钟前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语13 分钟前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
何以解忧,唯有..31 分钟前
高并发下超卖问题解决方案:从数据库到分布式锁的完整实践
java
行者全栈架构师43 分钟前
Spring Boot 接入 MaxKey 单点登录:6 个内部系统,一次登录全通行
java·vue.js·后端
袋鼠云数栈UED团队1 小时前
AI Coding 方法论分析:同一个需求 SpecKit 、 Superpowers、 MattpocockSkills 不同设计
前端·aigc·ai编程
掰头战士1 小时前
Prompt Cache,如果agent全靠LLM方做隐式缓存实在不够用。
前端·llm·agent
木白CPP1 小时前
Linux DMA驱动详解(二)-----DMA的使用者
java·linux·运维
caoerzhong1 小时前
JeeWMS 开源仓库管理系统 GPL-3.0 合规指南:Java WMS 二次开发前必须弄清的授权边界
java·开发语言·开源·vue
LEE1 小时前
前端转型全栈 01:数据建模,前端最大的盲区
前端·javascript·后端