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

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

相关推荐
用户4445543654269 小时前
Android跑马灯控件
前端
小同志009 小时前
application.properties 和 application.yml
java·spring boot·spring·application.yml·.properities
光影少年9 小时前
react全局状态、局部状态、服务端状态如何选型
前端·react.js·掘金·金石计划
甄心爱学习9 小时前
【项目实训(个人10)】
开发语言·前端·javascript
唐青枫9 小时前
Java JdbcTemplate 实战指南:用 Spring 轻量完成数据库增删改查
java·spring boot·spring
未秃头的程序猿9 小时前
别再让大模型单打独斗了!Java 多 Agent 协作实战:任务拆解+结果聚合
java·后端·ai编程
7yue9 小时前
我用 AI 把 Learn Claude Code 改写成了 TypeScript + 代数效应版本
前端
云宝大王9 小时前
JavaScript 异步编程:从回调到探索 Promise的秘密
前端·javascript
右耳朵猫AI9 小时前
Java & JVM技术周刊 2026年第20周
java·开发语言·jvm
daols889 小时前
vxe-table 进阶:同时使用 formatter 与 cell-render 实现格式化与样式定制
前端·javascript·vue.js·vxe-table