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

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

相关推荐
Java牛马3 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌3 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
东小西4 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
Profile排查笔记4 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
mqiqe5 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim5 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
denggun123455 小时前
yield
前端·数据库·python
前端snow5 小时前
ai agent -- prompt汇总
前端
脉动数据行情5 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
muddjsv7 小时前
前端性能优化实战:从加载到渲染的全面提速指南
前端·性能优化