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());
            }
        }
    }
相关推荐
计算机学姐5 小时前
基于SpringBoot的高校社团管理系统【协同过滤推荐算法+数据可视化】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法
Jonathan Star8 小时前
沉浸式雨天海岸:用A-Frame打造WebXR互动场景
前端·javascript
工业甲酰苯胺8 小时前
实现 json path 来评估函数式解析器的损耗
java·前端·json
老前端的功夫8 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
LilySesy9 小时前
ABAP+WHERE字段长度不一致报错解决
java·前端·javascript·bug·sap·abap·alv
Wang's Blog10 小时前
前端FAQ: Vue 3 与 Vue 2 相⽐有哪些重要的改进?
前端·javascript·vue.js
再希10 小时前
React+Tailwind CSS+Shadcn UI
前端·react.js·ui
用户479492835691510 小时前
JavaScript 的 NaN !== NaN 之谜:从 CPU 指令到 IEEE 754 标准的完整解密
前端·javascript
群联云防护小杜11 小时前
国产化环境下 Web 应用如何满足等保 2.0?从 Nginx 配置到 AI 防护实战
运维·前端·nginx
ss27311 小时前
Springboot + vue 医院管理系统
vue.js·spring boot·后端