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());
            }
        }
    }
相关推荐
PandaCave3 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
软件小伟5 分钟前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾26 分钟前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧35 分钟前
TypeScript 的发展与基本语法
前端·javascript·typescript
hummhumm44 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
chusheng18401 小时前
Java项目-基于SpringBoot+vue的租房网站设计与实现
java·vue.js·spring boot·租房·租房网站
asleep7011 小时前
第8章利用CSS制作导航菜单
前端·css
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
游走于计算机中摆烂的1 小时前
启动前后端分离项目笔记
java·vue.js·笔记
幼儿园的小霸王2 小时前
通过socket设置版本更新提示
前端·vue.js·webpack·typescript·前端框架·anti-design-vue