当前位置: 首页 > news >正文

【Spring Boot】如何自定义序列化以及反序列器

        在我们使用默认的消息转换器,将java的Long类型通过json数据传输到前端JS时,会导致Long类型的精度丢失,这是因为JS处理Long类型数字只能精确到前16位,所以我们可以采用自定义序列化方式将Long类型数据统一转为String字符串,然后再传输到前端即可解决问题。

  1. 定义jackson的对象映射器
    1. package com.app.studypro.common;import com.fasterxml.jackson.databind.DeserializationFeature;
      import com.fasterxml.jackson.databind.ObjectMapper;
      import com.fasterxml.jackson.databind.module.SimpleModule;
      import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
      import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
      import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
      import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
      import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
      import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
      import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;import java.math.BigInteger;
      import java.time.LocalDate;
      import java.time.LocalDateTime;
      import java.time.LocalTime;
      import java.time.format.DateTimeFormatter;import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;/*** 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]** @author Administrator*/
      public class JacksonObjectMapper extends ObjectMapper {/*** LocalDate类型*/public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";/*** LocalDateTime类型*/public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";/*** LocalTime类型*/public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";@SuppressWarnings("ResultOfMethodCallIgnored")public JacksonObjectMapper() {super();// 收到未知属性时不报异常this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);// 反序列化时,属性不存在的兼容处理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 配置注册序列化程序和反序列化程序的自定义信息SimpleModule simpleModule = new SimpleModule()// 时间的反序列化.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))// BigInteger的序列化.addSerializer(BigInteger.class, ToStringSerializer.instance)// Long的序列化.addSerializer(Long.class, ToStringSerializer.instance)// 时间的序列化.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));// 注册功能模块,以此可以添加自定义序列化器和反序列化器this.registerModule(simpleModule);}}
      
  2. 在Spring mvc的消息转换器中添加jackson的对象映射器
    1. package com.app.studypro.config;import com.app.studypro.common.JacksonObjectMapper;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.http.converter.HttpMessageConverter;
      import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
      import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import java.util.List;/*** Spring mvc的配置设定** @author Administrator*/
      @Slf4j
      @Configuration
      public class WebMvcConfig extends WebMvcConfigurationSupport {@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("扩展消息转换器,自定义添加 {} 消息转化器到spring mvc中", JacksonObjectMapper.class);// 创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();// 设置对象转换器,底层使用Jackson将Java对象转为jsonmessageConverter.setObjectMapper(new JacksonObjectMapper());// 将上面的消息转换器对象追加到mvc框架的转换器集合中,将其放在转换器集合的首个位置converters.add(0, messageConverter);}}
      
http://www.lryc.cn/news/236104.html

相关文章:

  • 6 Redis的慢查询配置原理
  • JAVA小游戏 “拼图”
  • Spring 配置
  • 全新酷盒9.0源码:多功能工具箱软件的最新iapp解决方案
  • aspose.cells java合并多个excel
  • 【每日一题】三个无重叠子数组的最大和
  • react之基于@reduxjs/toolkit使用react-redux
  • 基于51单片机水位监测控制报警仿真设计( proteus仿真+程序+设计报告+讲解视频)
  • git基本用法和操作
  • 设计模式-组合模式-笔记
  • Android 弹出自定义对话框
  • (论文阅读40-45)图像描述1
  • 4核8G服务器价格选择轻量还是CVM合适?
  • Selenium操作已经打开的Chrome浏览器窗口
  • 创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究
  • rv1126-rv1109-openssh
  • MySQL中json类型,你使用过吗
  • MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法
  • 杭州-区块链前瞻性论坛邀请函​
  • ElasticSearch学习篇6_ES实践与Lucene对比及原理分析技术分享小记
  • mysql练习1
  • 【2017年数据结构真题】
  • 神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!
  • 解决Qt5.13.0无MySQL驱动问题
  • YOLOv8改进 | 如何在网络结构中添加注意力机制、C2f、卷积、Neck、检测头
  • 记录一个困难
  • Linux 进程管理 实时调度类及SMP和NUMA
  • 线性表--链表-1
  • WPF小知识
  • 坐标系下的运动旋量转换