首页/新闻资讯/正文详情

springboot web jackson

发布时间:2026/9/27 6:21:39 来源:云帆数科 栏目:资讯中心
springboot web jackson
简述springboot web 自定义Jackson ObjectMapperBeanSerializerModifierimportcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.BeanDescription;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.SerializationConfig;importcom.fasterxml.jackson.databind.SerializerProvider;importcom.fasterxml.jackson.databind.ser.BeanPropertyWriter;importcom.fasterxml.jackson.databind.ser.BeanSerializerModifier;importjava.io.IOException;importjava.time.LocalDateTime;importjava.util.Collection;importjava.util.Date;importjava.util.List;publicclassCustomNullSerializerModifierextendsBeanSerializerModifier{privatefinalStringNullSerializerstringNullSerializer;privatefinalArrayNullSerializerarrayNullSerializer;privatefinalDateNullSerializerdateNullSerializer;privatefinalNumberNullSerializernumberNullSerializer;publicCustomNullSerializerModifier(){this.stringNullSerializernewStringNullSerializer();this.arrayNullSerializernewArrayNullSerializer();this.dateNullSerializernewDateNullSerializer();this.numberNullSerializernewNumberNullSerializer();}OverridepublicListBeanPropertyWriterchangeProperties(SerializationConfigconfig,BeanDescriptionbeanDesc,ListBeanPropertyWriterbeanProperties){for(BeanPropertyWriterwriter:beanProperties){if(isString(writer)){writer.assignNullSerializer(this.stringNullSerializer);}elseif(isArrayType(writer)){writer.assignNullSerializer(this.arrayNullSerializer);}elseif(isNumberType(writer)){writer.assignNullSerializer(this.numberNullSerializer);}elseif(isDateType(writer)){writer.assignNullSerializer(this.dateNullSerializer);}elseif(isLocalDateTime(writer)){writer.assignNullSerializer(this.dateNullSerializer);}}returnbeanProperties;}booleanisString(BeanPropertyWriterwriter){returnwriter.getType().getRawClass().isAssignableFrom(String.class);}booleanisArrayType(BeanPropertyWriterwriter){returnwriter.getType().getRawClass().isArray()||writer.getType().getRawClass().isAssignableFrom(List.class)||writer.getType().getRawClass().isAssignableFrom(Collection.class);}booleanisNumberType(BeanPropertyWriterwriter){returnwriter.getType().getRawClass().isAssignableFrom(Integer.class)||writer.getType().getRawClass().isAssignableFrom(Long.class)||writer.getType().getRawClass().isAssignableFrom(Double.class);}booleanisDateType(BeanPropertyWriterwriter){returnwriter.getType().getRawClass().isAssignableFrom(Date.class);}booleanisLocalDateTime(BeanPropertyWriterwriter){returnwriter.getType().getRawClass().isAssignableFrom(LocalDateTime.class);}}classStringNullSerializerextendsJsonSerializerObject{Overridepublicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{jsonGenerator.writeString();}}classArrayNullSerializerextendsJsonSerializerObject{Overridepublicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{jsonGenerator.writeStartArray();jsonGenerator.writeEndArray();}}classDateNullSerializerextendsJsonSerializerObject{Overridepublicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{jsonGenerator.writeNull();}}classNumberNullSerializerextendsJsonSerializerObject{Overridepublicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{if(oinstanceofDouble){jsonGenerator.writeNumber(0.00);}elseif(oinstanceofFloat){jsonGenerator.writeNumber(0.00f);}else{jsonGenerator.writeNumber(0);}}}Object Mapperimportcom.fasterxml.jackson.annotation.JsonInclude;importcom.fasterxml.jackson.core.json.JsonReadFeature;importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.SerializationFeature;importcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule;importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;importcom.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;importcom.ft.mall.common.json.serializer.CustomNullSerializerModifier;importjava.text.SimpleDateFormat;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.LocalTime;importjava.time.ZoneId;importjava.time.format.DateTimeFormatter;importjava.util.TimeZone;publicclassCustomObjectMapperextendsObjectMapper{privatestaticfinalStringDATE_TIMEyyyy-MM-dd HH:mm:ss;privatestaticfinalStringDATEyyyy-MM-dd;privatestaticfinalStringTIMEHH:mm:ss;publicCustomObjectMapper(){super();registerModule();setSerializer();configure();this.setSerializerFactory(this.getSerializerFactory().withSerializerModifier(newCustomNullSerializerModifier()));}/* * LocalDateTime transfer */privatevoidregisterModule(){JavaTimeModulejavaTimeModulenewJavaTimeModule();javaTimeModule.addSerializer(LocalDateTime.class,newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME)));javaTimeModule.addDeserializer(LocalDateTime.class,newLocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME)));javaTimeModule.addSerializer(LocalDate.class,newLocalDateSerializer(DateTimeFormatter.ofPattern(DATE)));javaTimeModule.addDeserializer(LocalDate.class,newLocalDateDeserializer(DateTimeFormatter.ofPattern(DATE)));javaTimeModule.addSerializer(LocalTime.class,newLocalTimeSerializer(DateTimeFormatter.ofPattern(TIME)));javaTimeModule.addDeserializer(LocalTime.class,newLocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME)));registerModule(javaTimeModule);}privatevoidsetSerializer(){// 1. 序列化配置 // 序列化时忽略 null 值字段不输出 null 字段setSerializationInclusion(JsonInclude.Include.NON_NULL);// 序列化空对象不抛错比如空 Bean 转 JSONconfigure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);// 日期格式统一Date 类型setDateFormat(newSimpleDateFormat(yyyy-MM-dd HH:mm:ss));setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));}privatevoidconfigure(){// 2. 反序列化配置 // JSON 存在 Java 对象没有的字段时不抛错最常用configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);// 允许 JSON 字符串带多余的转义比如 \ 这种configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(),true);// 允许 JSON 数字用引号包裹如 age:18 → 自动转 intconfigure(JsonReadFeature.ALLOW_SINGLE_QUOTES.mappedFeature(),true);// 时间不序列化成时间戳而是字符串configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);// 未知属性不报错configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);}}web 注册ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{BeanpublicMappingJackson2HttpMessageConverterconfigureMessageConverters(){MappingJackson2HttpMessageConverterjackson2HttpMessageConverternewMappingJackson2HttpMessageConverter();ObjectMapperobjectMappernewCustomObjectMapper();jackson2HttpMessageConverter.setObjectMapper(objectMapper);ListMediaTypelistnewArrayList();MediaTypemediaTypenewMediaType(application,json,StandardCharsets.UTF_8);list.add(mediaType);jackson2HttpMessageConverter.setSupportedMediaTypes(list);returnjackson2HttpMessageConverter;}}

相关推荐

别再找百度免费网站建设了,一文搞懂真实成本与避坑指南
别再找百度免费网站建设了,一文搞懂真实成本与避坑指南

别再找百度免费网站建设了,一文搞懂真实成本与避坑指南 很多老板一开口就是:“百度不是有免费建站吗?为什么还要花几万块找你们做?” 这句话我听了十年,耳朵都起茧子了。实话告诉你,那种“免费”的模板网站,上线三天你就想砸了电脑。… · 2026/9/27 6:21:39

RK3568适配OV13850全流程解析:硬件时序、协议握手与V4L2链路调优
RK3568适配OV13850全流程解析:硬件时序、协议握手与V4L2链路调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 6:21:39

搞定wordpress登陆404:3种修复路径与最佳实践
搞定wordpress登陆404:3种修复路径与最佳实践

搞定wordpress登陆404:3种修复路径与最佳实践 改个需求建站公司拖一周,这种憋屈事谁没碰过? 你明明只是想让后台登录页别404,结果对方说“服务器要重启”、“插件冲突要排查”,一拖就是好几天。其实, wordpress登陆404… · 2026/9/27 6:21:02

分组密码填充(Padding)完全指南:PKCS7、0x80 填充规则与不校验填充引发的 CTF 攻击
分组密码填充(Padding)完全指南:PKCS7、0x80 填充规则与不校验填充引发的 CTF 攻击

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 本文以 CTF Wiki 中 填充方式 一节为骨架,系统梳理分组密码中常见的五种填充规则及其字节级示例… · 2026/9/27 7:03:38

不会代码也能做站:新手建站广告联盟赚钱完整流程
不会代码也能做站:新手建站广告联盟赚钱完整流程

不会代码也能做站:新手建站广告联盟赚钱完整流程 自己不会代码想做网站,是不是觉得心里发虚,怕被坑钱或者根本做不出来?别慌,今天就把这套 新手建站广告联盟赚钱 的 完整流程… · 2026/9/27 7:03:32

RSUITE DOMHelper 使用指南:React 项目中的 DOM 操作助手 API 全解析
RSUITE DOMHelper 使用指南:React 项目中的 DOM 操作助手 API 全解析

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 在 React 项目中,官方并不推荐直接操作 DOM,而是主张通过状态与虚拟 DOM 驱动界… · 2026/9/27 7:03:32

Open CoDesign EDITMODE 协议指南:从 TWEAK_DEFAULTS 声明到可调节控件的完整实现
Open CoDesign EDITMODE 协议指南:从 TWEAK_DEFAULTS 声明到可调节控件的完整实现

人工智能AI 应用桌面应用 【免费下载链接】open-codesign Open-source Claude Design alternative. One-click import your Claude Code / Codex API key. Prompt → prototype / slides / PDF. Multi-model (Claude, GPT, Gemini, Kimi, GLM, Ollama). BYOK, local-first, MIT… · 2026/9/27 7:03:26

GitHub Desktop 发布说明写作规范与自动化流程解析
GitHub Desktop 发布说明写作规范与自动化流程解析

开发工具桌面应用 【免费下载链接】desktop Fork of GitHub Desktop to support various Linux distributions 项目地址: https://gitcode.com/gh_mirrors/des/desktop 点击查看 免费下载 本篇技术指南基于 GitHub Desktop 仓库的 docs/process/writing-release-no… · 2026/9/27 7:03:26

iPhone手机防盗迎来重大升级!iOS 27自动锁定功能曝光,被偷瞬间秒锁屏保护你的数据
iPhone手机防盗迎来重大升级!iOS 27自动锁定功能曝光,被偷瞬间秒锁屏保护你的数据

手机被人从手里一把拽走的那几秒钟,恰恰是你最不设防的时刻——屏幕还亮着,微信还在弹消息,支付宝甚至不需要密码就能打开。就在这个令人后背发凉的缝隙里,苹果悄悄出手了。在最新曝光的 iOS 27 Beta 2 版本中,一项名为… · 2026/9/27 7:03:20

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码