欢迎光临
我们一直在努力

Java 企业级工具类全家桶-74-JSON序列化工具类

📌 拿来即用: Java 企业级工具类全家桶-74-JSON序列化工具类

📋 目录

  • 一、工具类功能
  • 二、所需环境
  • 三、方法概览(按需调用)
  • 四、调用示例(直观体验)
  • 五、工具类源码(可直接复制)

一、工具类功能

给业务代码用的 JSON 工具类:对象、List/Map、泛型结构与 JSON 字符串互转,DTO/VO/实体互转,日期时间按统一格式读写,不必到处 new ObjectMapper。

两套错误契约:parseXxx 严格模式,报文非法就抛异常;parseXxxQuietly 容错模式,空白与非法给 null 或空集合。忽略实体多出来的字段,但拒绝残缺报文;面向报文级读写,不做超大 JSON 的流式处理。


二、所需环境

JDK 17或以上 + Spring Boot 3.x或以上

<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 就能看到调用工具类各方法的输出结果。

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

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序列化工具类」 的完整源码,拿来即用。


觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯

赞(0)
未经允许不得转载:171主机测评 » Java 企业级工具类全家桶-74-JSON序列化工具类
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址