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

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


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

相关推荐
ZealSinger2 小时前
Boot4升级PostConstruct不跑了
java·spring boot·spring·升级迁移
专业程序开发源3 小时前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
vx_Biye_Design3 小时前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
vx_Biye_Design3 小时前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
程序员小杰@3 小时前
Spring Boot 常用注解分类速记
java·spring boot·后端
vx_Biye_Design3 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
9624564 小时前
餐饮 SaaS 优惠券系统架构演进(三):优惠计算引擎——商品级计价、冲突策略与优惠分摊
java·数据库·spring boot
vx_Biye_Design4 小时前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express
vx_Biye_Design5 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物