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

文章目录

  • 前言
  • 一、配置文件
  • 二、配置类
  • 三、注解
  • 四、json工具类
    • 1. 工具内容
    • 2. 使用工具


前言

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

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

一、配置文件

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

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

二、配置类

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

@Slf4j
@Configuration
public class JacksonConfig {@Beanpublic 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 配置");};}
}

三、注解

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

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

四、json工具类

1. 工具内容

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

/*** 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) {// 类型不匹配说明不是jsonreturn 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方法

@RestController
@RequestMapping("/demo/test")
@SaIgnore // 忽略校验
public class TestController {@GetMapping("JsonUtils")public void testGetObjectMapper(){// 获取objectMapper ObjectMapper objectMapper = JsonUtils.getObjectMapper();// 打印Console.log("objectMapper,{}",objectMapper);}
}

在这里插入图片描述

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

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建对象User user = new User("张三" , 18);// 序列化String str = JsonUtils.toJsonString(user);Console.log(str);}

在这里插入图片描述

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

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建jsonString json="{\"name\":\"张三\",\"age\":18}";// 反序列化User user = JsonUtils.parseObject(json, User.class);Console.log(user);}

在这里插入图片描述

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

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建jsonString json="{\"name\":\"张三\",\"age\":18}";// 反序列化User user = JsonUtils.parseObject(StrUtil.utf8Bytes(json), User.class);Console.log(user);}

在这里插入图片描述

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

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建jsonString json="[{\"name\":\"张三\",\"age\":18}]";// 反序列化List<User> users = JsonUtils.parseObject(json, new TypeReference<List<User>>() {});Console.log(users);}

在这里插入图片描述

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

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建jsonString json="{\"name\":\"张三\",\"age\":18}";// 反序列化Dict dict = JsonUtils.parseMap(json);if (dict != null) {Console.log(dict.get("name"));}}

在这里插入图片描述

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

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建jsonString 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方法,将字符串转换字典列表

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 创建jsonString 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());}}}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/501984.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java8 - LocalDateTime时间日期类使用详解

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

苹果备忘录导出方法

文章目录 前言方法1&#xff1a;iCloud 导出方法2&#xff1a;Pages 文稿导出&#xff08;最推荐&#xff09;方法3&#xff1a;借助Mac软件导出总结 前言 苹果生态真是让我们又爱又恨&#xff0c;其得益于无缝整合、安全性和应用程序生态系统&#xff0c;能够让在用户在自己的…

【LeetCode】一周中的第几天+ 一年中的第几天

2023-12-30 文章目录 一周中的第几天方法一&#xff1a;模拟思路步骤 方法二&#xff1a;调用库函数方法三&#xff1a;调用库函数 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一&#xff1a;直接计算思路&#xff1a; 方法二&#xff1a;调用…

如何p掉照片上的路人?一分钟教你快速去除

我们旅游的时候&#xff0c;拍照是必不可少的一个环节。但是&#xff0c;有时候照片的背景中会出现一些路人&#xff0c;让照片的美观度大打折扣。那么照片如何p掉路人呢&#xff1f;今天&#xff0c;我就来给大家分享几个实用的小技巧&#xff0c;让你轻松成为“P图大师”。 …

【Mysql】InnoDB 中 B+ 树索引的注意事项

一、根页面万年不动 在之前的文章里&#xff0c;为了方便理解&#xff0c;都是先画存储用户记录的叶子节点&#xff0c;然后再画出存储目录项记录的内节点。 但实际上 B 树的行成过程是这样的&#xff1a; 每当为某个表创建一个 B 树索引&#xff0c;都会为这个索引创建一个根…

学不动系列-git-hooks和husky+lintstage

git-hooks 为了保证提交的代码符合规范&#xff0c;可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现&#xff0c;在使用husky之前&#xff0c;我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…

c++入门(2)

上期我们说到了部分c修补C语言的不足&#xff0c;今天我们将剩下的一一说清楚。 函数重载 (1).函数重载的形式 C语言不允许函数名相同的同时存在&#xff0c;但是C允许同名函数存在&#xff0c;但是有要求&#xff1a;函数名相同&#xff0c;参数不同&#xff0c;构成函数重…

比特币暴涨逼近历史最高点;阿里云全线降价20%丨 RTE 开发者日报 Vol.155

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

vue3基础教程(1)——nodejs环境搭建

博主个人小程序已经上线&#xff1a;【中二少年工具箱】 小程序二维如下&#xff1a; 正文开始 专栏简介1. 环境菜单2.为什么下载node3. nodejs简介4. nodejs安装5. 编辑器选择 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造,最高工作电压 50V,耐压 80V

GC2003 内部集成了 7 个 NPN 达林顿晶体管&#xff0c;连接的阵列&#xff0c;非常适合逻辑接口电平数字电路&#xff08;例 如 TTL&#xff0c;CMOS 或PMOS 上/NMOS&#xff09;和较高的电流/电压&#xff0c;如电灯电磁阀&#xff0c;继电器&#xff0c;打印机或其他类似的负…

完美解决Iframe嵌入帆软报表出现跨域cookie写不进去的问题

随着google chrome对第三方cookie的限制越来越狠,现在发现之前使用iframe嵌入的帆软报表已经不好使了。官方现在解决iframe嵌入帆软报表出现跨域导致cookie写不进去的方案是主推 统一主域名的方案(谷歌浏览器单点登录失败- FineReport帮助文档 - 全面的报表使用教程和学习资料…

Apache Calcite 一条 SQL 的查询计划生成之旅【下】

作者&#xff1a;沈磊&#xff08;LakeShen&#xff09;&#xff0c;公众号&#xff1a;雷克分析 上一篇文章我们讲解了 Apache Calcite 架构设计及 SQL 优化器概述&#xff0c;这篇文章我们将接着介绍 Apache Calcite 组件的关键原理。 三、Calcite SQL 解析和元数据验证关键…