RuoYi-Vue-Plus功能分析-jackson配置

文章目录


前言

前端在给我发送请求的时候一般包含三个部分url,header,body。那么就会涉及我们后端如何接收这些请求参数并且我们处理完毕参数后前端又如何接收参数

通过url传递参数一般情况我们不需要序列化/反序列化处理,而通过body传递的参数我们就需要**反序列化**处理。处理完毕后参数返回给前端就是**序列化**

一、配置文件

在rouyi-admin的application.yml文件中配置了如下内容

yaml 复制代码
spring:
  jackson:
    # 日期格式化
    date-format: yyyy-MM-dd HH:mm:ss
    serialization:
      # 格式化输出
      indent_output: false
      # 忽略无法转换的对象
      fail_on_empty_beans: false
    deserialization:
      # 允许对象忽略json中不存在的属性
      fail_on_unknown_properties: false

二、配置类

位于package com.ruoyi.framework.config添加如下配置并且交给bean管理

java 复制代码
@Slf4j
@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            // 全局配置序列化返回 JSON 处理
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
            javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
            builder.modules(javaTimeModule);
            builder.timeZone(TimeZone.getDefault());
            log.info("初始化 jackson 配置");
        };
    }
}

三、注解

如果配置的无法满足需求可以通过注解的方式解决

java 复制代码
/**
 * 搜索值
 */
@JsonIgnore	// 不进行序列化与反序列化处理
@TableField(exist = false)
private String searchValue;
java 复制代码
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY) // 只要非空的时候进行序列化与反序列化处理
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
java 复制代码
@JsonIgnore
@JsonProperty	// 指定别名
public String getPassword() {
    return password;
}
java 复制代码
@JsonFormat(pattern = "yyyy-MM-dd") // 指定日期序列化与反序列化格式格式

四、json工具类

1. 工具内容

位于package com.ruoyi.common.utils;包下

java 复制代码
/**
 * JSON 工具类
 *
 * @author 芋道源码
 */
// 生成一个私有的无参构造函数
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JsonUtils {

    // 创建OBJECT_MAPPER实例对象
    private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class);

    // 获取OBJECT_MAPPER实例对象
    public static ObjectMapper getObjectMapper() {
        return OBJECT_MAPPER;
    }

    // 将对象转换为字符串
    public static String toJsonString(Object object) {
        if (ObjectUtil.isNull(object)) {
            return null;
        }
        try {
            return OBJECT_MAPPER.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    // 将字符串转换为对象
    public static <T> T parseObject(String text, Class<T> clazz) {
        if (StringUtils.isEmpty(text)) {
            return null;
        }
        try {
            return OBJECT_MAPPER.readValue(text, clazz);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 将字节数组转换为对象
    public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
        if (ArrayUtil.isEmpty(bytes)) {
            return null;
        }
        try {
            return OBJECT_MAPPER.readValue(bytes, clazz);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //  将字符串转换为对象(使用TypeReference)
    public static <T> T parseObject(String text, TypeReference<T> typeReference) {
        if (StringUtils.isBlank(text)) {
            return null;
        }
        try {
            return OBJECT_MAPPER.readValue(text, typeReference);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 将字符串转换为字典使用比hashmap更简单
    public static Dict parseMap(String text) {
        if (StringUtils.isBlank(text)) {
            return null;
        }
        try {
            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class));
        } catch (MismatchedInputException e) {
            // 类型不匹配说明不是json
            return null;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 将字符串转换为字典列表
    public static List<Dict> parseArrayMap(String text) {
        if (StringUtils.isBlank(text)) {
            return null;
        }
        try {
            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 将字符串转换为对象列表
    public static <T> List<T> parseArray(String text, Class<T> clazz) {
        if (StringUtils.isEmpty(text)) {
            return new ArrayList<>();
        }
        try {
            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

2. 使用工具

测试getObjectMapper方法

java 复制代码
@RestController
@RequestMapping("/demo/test")
@SaIgnore // 忽略校验
public class TestController {


    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 获取objectMapper 
        ObjectMapper objectMapper = JsonUtils.getObjectMapper();

        // 打印
        Console.log("objectMapper,{}",objectMapper);
    }
}

测试toJsonString方法,将对象转换为字符串

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建对象
        User user = new User("张三" , 18);

        // 序列化
        String str = JsonUtils.toJsonString(user);
        Console.log(str);
    }

测试parseObject方法,将字符串转换对象

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建json
        String json="{\"name\":\"张三\",\"age\":18}";

        // 反序列化
        User user = JsonUtils.parseObject(json, User.class);
        Console.log(user);
    }

测试parseObject方法,将字节数组转换对象

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建json
        String json="{\"name\":\"张三\",\"age\":18}";

        // 反序列化
        User user = JsonUtils.parseObject(StrUtil.utf8Bytes(json), User.class);
        Console.log(user);
    }

测试parseObject方法,将字符串转换为复杂类型

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建json
        String json="[{\"name\":\"张三\",\"age\":18}]";

        // 反序列化
        List<User> users = JsonUtils.parseObject(json, new TypeReference<List<User>>() {
        });
        Console.log(users);
    }

测试parseMap方法,将字符串转换字典,Dict继承了LinkedHashMap对其做了进一步增强

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建json
        String json="{\"name\":\"张三\",\"age\":18}";

        // 反序列化
        Dict dict = JsonUtils.parseMap(json);
        if (dict != null) {
            Console.log(dict.get("name"));
        }
    }

测试parseArrayMap方法,将字符串转换字典列表,Dict继承了LinkedHashMap对其做了进一步增强

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建json
        String json="[{\"name\":\"张三\",\"age\":18}]";

        // 反序列化
        List<Dict> dictList = JsonUtils.parseArrayMap(json);
        if (CollectionUtil.isNotEmpty(dictList)) {
            for (Dict dict : dictList) {
                Console.log("name: {}, age: {}", dict.getStr("name"), dict.getInt("age"));
            }
        }
    }

测试parseArrayMap方法,将字符串转换字典列表

java 复制代码
    @GetMapping("JsonUtils")
    public void testGetObjectMapper(){

        // 创建json
        String json="[{\"name\":\"张三\",\"age\":18}]";

        // 反序列化
        List<User> userList = JsonUtils.parseArray(json, User.class);
        if (CollectionUtil.isNotEmpty(userList)) {
            for (User user : userList) {
                Console.log("name: {}, age: {}", user.getName(), user.getAge());
            }
        }
    }
相关推荐
布局呆星42 分钟前
Vue Router :基础使用与嵌套路由实战
前端·javascript·vue.js
小码哥_常6 小时前
安卓开发秘籍:解锁10大性能优化秘诀
前端
谁呛我名字7 小时前
JavaScript 类型转换与运算规则
javascript
try2find7 小时前
打印ascii码报错问题
java·linux·前端
郑州光合科技余经理8 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
冰暮流星8 小时前
javascript事件案例-全选框案例
服务器·前端·javascript
Dillon Dong9 小时前
【系列主题】Next.js 16 + Turbopack 的暗礁:深入剖析 Tailwind v4 的 CSS 模块解析陷阱
javascript·css·容器·turbopack
Csvn9 小时前
前端性能优化实战指南
前端
Moment9 小时前
2026 年,AI 全栈时代到了,前端简历别再只写前端技术了 🫠🫠🫠
前端·后端·面试
糯米团子7499 小时前
Web Worker
开发语言·前端·javascript