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());
            }
        }
    }
相关推荐
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅3 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅4 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊4 小时前
jwt介绍
前端
爱敲代码的小鱼4 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
吹牛不交税4 小时前
admin.net-v2 框架使用笔记-netcore8.0/10.0版
vue.js·.netcore