📌 拿来即用 : Java 企业级工具类全家桶-74-JSON序列化工具类
📋 目录
一、工具类功能
给业务代码用的 JSON 工具类:对象、List/Map、泛型结构与 JSON 字符串互转,DTO/VO/实体互转,日期时间按统一格式读写,不必到处 new ObjectMapper。
两套错误契约:parseXxx 严格模式,报文非法就抛异常;parseXxxQuietly 容错模式,空白与非法给 null 或空集合。忽略实体多出来的字段,但拒绝残缺报文;面向报文级读写,不做超大 JSON 的流式处理。
二、所需环境
JDK 17或以上 + Spring Boot 3.x或以上
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
三、方法概览(按需调用)
| 序号 | 方法 | 入参 | 返回 | 用途 |
|---|---|---|---|---|
| 1 | toJson(Object) | 待序列化对象 | String | 紧凑 JSON 字符串,对象为 null 得到 "null" |
| 2 | toPrettyJson(Object) | 待序列化对象 | String | 带缩进的多行 JSON,排查与落日志用 |
| 3 | parseObject(String, Class) | JSON 字符串 + 目标类型 | T | 严格模式取单个对象 |
| 4 | parseObject(String, TypeReference) | JSON 字符串 + 泛型类型 | T | 严格模式取 List/Map 等泛型结构 |
| 5 | parseObjectQuietly(String, Class) | JSON 字符串 + 目标类型 | T | 容错模式,空白或非法给 null |
| 6 | parseList(String, Class) | JSON 字符串 + 元素类型 | List | 严格模式取列表,元素类型直接指定 |
| 7 | parseListQuietly(String, Class) | JSON 字符串 + 元素类型 | List | 容错模式,空白、非法或结构不符给空列表 |
| 8 | parseMap(String, Class, Class) | JSON 字符串 + 键类型 + 值类型 | Map<K,V> | 严格模式取 Map,键值类型直接指定 |
| 9 | convertValue(Object, Class) | 源对象 + 目标类型 | T | DTO/VO/实体互转,不必先转成字符串 |
| 10 | convertValue(Object, TypeReference) | 源对象 + 泛型类型 | T | 转成泛型结构,如 List |
| 11 | getObjectMapper() | 无 | ObjectMapper | 拿共享单例做工具没覆盖的操作 |
四、调用示例(直观体验)
调用示例直接复制进 IDE 右键 Run 就能看到调用工具类各方法的输出结果。
java
21:00:28.888 [main] INFO -- 「JsonUtils 方法1 toJson(Object)」返回JSON字符串 -> {"name":"双十一订单","count":3}
21:00:28.891 [main] INFO -- 「JsonUtils 方法2 toPrettyJson(Object)」返回美化JSON(共4行)->
{
"name" : "双十一订单",
"count" : 3
}
21:00:28.911 [main] INFO -- 「JsonUtils 方法3 parseObject(json, Class)」返回对象 -> Order[name=双十一订单, count=3]
21:00:28.925 [main] INFO -- 「JsonUtils 方法4 parseObject(json, TypeReference)」返回集合列表 -> [Order[name=甲, count=1], Order[name=乙, count=2]]
21:00:28.925 [main] INFO -- 「JsonUtils 方法6 parseList(json, Class)」返回集合列表 -> [Order[name=甲, count=1]]
21:00:28.928 [main] INFO -- 「JsonUtils 方法8 parseMap(json, Class, Class)」返回Map -> {k1=Order[name=甲, count=1]}
21:00:28.935 [main] INFO -- 「JsonUtils 方法1 toJson(Object)」日期按约定格式写出 -> {"name":"下单","at":"2026-10-04 20:30:00","day":"2026-10-04","time":"20:30:00"}
21:00:28.937 [main] INFO -- 「JsonUtils 方法3 parseObject(json, Class)」还原日期时间 -> Event[name=下单, at=2026-10-04T20:30, day=2026-10-04, time=20:30]
21:00:28.941 [main] INFO -- 「JsonUtils 方法5 parseObjectQuietly(json, Class)」非法输入容错 -> null
21:00:28.942 [main] INFO -- 「JsonUtils 方法7 parseListQuietly(json, Class)」结构不符容错 -> []
21:00:28.945 [main] INFO -- 「JsonUtils 方法9 convertValue(source, Class)」返回转换后对象 -> Order[name=线下单, count=5]
21:00:28.954 [main] INFO -- 「JsonUtils 方法10 convertValue(source, TypeReference)」返回集合列表 -> [Order[name=丙, count=9]]
21:00:28.955 [main] INFO -- 「JsonUtils 方法11 getObjectMapper()」返回全局共享单例 -> 同一实例=true
21:00:28.955 [main] ERROR -- 「异常信息获取演示」残缺报文被拒绝 -> JSON反序列化为对象失败: Unrecognized token '尾巴': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 24]
21:00:28.955 [main] ERROR -- 「异常信息获取演示」入参不合法 -> JSON字符串不能为空
进程已结束,退出代码为 0
java
package com.example.order.api;
import com.example.common.utils.JsonUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;
/**
* 调用示例:整个文件复制进 IDE,右键 Run 就能看效果。
*
* <p>JSON 工具不依赖外部服务,示例直接用内存里的对象与报文跑通全部入口;
* 日志用 Lombok 的 {@code @Slf4j} + SLF4J 占位符,没装 Lombok 就把 {@code log} 换成项目自己的 Logger。
*/
@Slf4j
public class JsonUtilsDemo {
/** 示例用的 DTO,实际换成你自己的 */
public record Order(String name, Integer count) {
}
public record OrderForm(String name, Integer count) {
}
public record Event(String name, LocalDateTime at, LocalDate day, LocalTime time) {
}
public static void main(String[] args) {
// ========== 一、对象与 JSON 字符串互转 ==========
String json = JsonUtils.toJson(new Order("双十一订单", 3));
log.info("「JsonUtils 方法1 toJson(Object)」返回JSON字符串 -> {}", json);
String pretty = JsonUtils.toPrettyJson(new Order("双十一订单", 3));
log.info("「JsonUtils 方法2 toPrettyJson(Object)」返回美化JSON(共{}行)->{}",
pretty.lines().count(), System.lineSeparator() + pretty);
Order order = JsonUtils.parseObject(json, Order.class);
log.info("「JsonUtils 方法3 parseObject(json, Class)」返回对象 -> {}", order);
// ========== 二、泛型结构:List 与 Map ==========
List<Order> orders = JsonUtils.parseObject("[{\"name\":\"甲\",\"count\":1},{\"name\":\"乙\",\"count\":2}]",
new TypeReference<>() {
});
log.info("「JsonUtils 方法4 parseObject(json, TypeReference)」返回集合列表 -> {}", orders);
List<Order> list = JsonUtils.parseList("[{\"name\":\"甲\",\"count\":1}]", Order.class);
log.info("「JsonUtils 方法6 parseList(json, Class)」返回集合列表 -> {}", list);
Map<String, Order> map = JsonUtils.parseMap("{\"k1\":{\"name\":\"甲\",\"count\":1}}",
String.class, Order.class);
log.info("「JsonUtils 方法8 parseMap(json, Class, Class)」返回Map -> {}", map);
// ========== 三、日期时间契约与容错版 ==========
String eventJson = JsonUtils.toJson(new Event("下单",
LocalDateTime.of(2026, 10, 4, 20, 30, 0), LocalDate.of(2026, 10, 4), LocalTime.of(20, 30)));
log.info("「JsonUtils 方法1 toJson(Object)」日期按约定格式写出 -> {}", eventJson);
Event event = JsonUtils.parseObject(eventJson, Event.class);
log.info("「JsonUtils 方法3 parseObject(json, Class)」还原日期时间 -> {}", event);
Order parsed = JsonUtils.parseObjectQuietly("{不是合法JSON}", Order.class);
log.info("「JsonUtils 方法5 parseObjectQuietly(json, Class)」非法输入容错 -> {}", parsed);
List<Order> quietList = JsonUtils.parseListQuietly("{不是数组}", Order.class);
log.info("「JsonUtils 方法7 parseListQuietly(json, Class)」结构不符容错 -> {}", quietList);
// ========== 四、convertValue 与共享 ObjectMapper ==========
OrderForm form = new OrderForm("线下单", 5);
Order converted = JsonUtils.convertValue(form, Order.class);
log.info("「JsonUtils 方法9 convertValue(source, Class)」返回转换后对象 -> {}", converted);
List<Order> convertedList = JsonUtils.convertValue(List.of(Map.of("name", "丙", "count", 9)),
new TypeReference<>() {
});
log.info("「JsonUtils 方法10 convertValue(source, TypeReference)」返回集合列表 -> {}", convertedList);
ObjectMapper shared = JsonUtils.getObjectMapper();
log.info("「JsonUtils 方法11 getObjectMapper()」返回全局共享单例 -> 同一实例={}", shared == JsonUtils.getObjectMapper());
// ========== 五、异常:严格模式的两条线 ==========
try {
JsonUtils.parseObject("{\"name\":\"甲\",\"count\":1} 尾巴", Order.class);
} catch (IllegalStateException e) {
log.error("「异常信息获取演示」残缺报文被拒绝 -> {}", e.getMessage());
}
try {
JsonUtils.parseObject(null, Order.class);
} catch (IllegalArgumentException e) {
log.error("「异常信息获取演示」入参不合法 -> {}", e.getMessage());
}
}
}
五、工具类源码(可直接复制)
📦 「点击此处可下载 Java企业级工具类全家桶-74-JSON序列化工具类」 的完整源码,拿来即用。
觉得对您有帮助,麻烦 点点关注啦 ,您的关注是我创作的最大动力~ 🎯