【jackson】自定义字段注解完成序列化逻辑

目录

  • 背景
  • 本文开发环境介绍
  • 新建一个注解
  • 新建一个JavaBean
  • 新建一个JsonSerializer
  • 新建一个AnnotationIntrospector
  • 单元测试
  • 总结

背景

Spring默认的JSON序列化工具使用的是jacksonGitHub项目地址: https://github.com/FasterXML/jackson

我们在处理前后端接口交互的时候,可能需要实现各种各样的个性化需求,这篇文章主要介绍自定义注解,然后对特定字段进行业务逻辑处理。

本文开发环境介绍

开发依赖版本
Spring Boot3.1.2
JDK17

新建一个注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JsonSerialize(using = PrintFieldJsonSerializer.class)
public @interface PrintField {Type rule() default Type.TYPE_1;enum Type {TYPE_1, TYPE_2}
}

新建一个JavaBean

在字段上使用自定义注解

import lombok.Builder;
import lombok.Data;/*** @author tangheng*/
@Data
@Builder
public class DemoPerson {@PrintField(rule = PrintField.Type.TYPE_1)private String name;@PrintField(rule = PrintField.Type.TYPE_2)private String email;
}

新建一个JsonSerializer

用来做自定义的业务逻辑

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;import java.io.IOException;@Slf4j
@RequiredArgsConstructor
public class PrintFieldJsonSerializer extends JsonSerializer<String> {private final PrintField.Type rule;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if(StringUtils.isBlank(value)) {return;}switch (rule) {case TYPE_1:log.info("hello, value: {}", value);break;default:log.info("rule: {}, value: {}", rule, value);break;}gen.writeString(value);}
}

新建一个AnnotationIntrospector

import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.introspect.Annotated;import java.lang.annotation.Annotation;public class PrintFieldAnnotationIntrospector extends AnnotationIntrospector {@Overridepublic Version version() {return Version.unknownVersion();}@Overridepublic Object findSerializer(Annotated a) {PrintField ann = _findAnnotation(a, PrintField.class);if (ann != null) {return new PrintFieldJsonSerializer(ann.rule());}return null;}@Overridepublic boolean isAnnotationBundle(Annotation ann) {if (PrintField.class.isAssignableFrom(ann.getClass())) {return true;}return false;}
}
  • 这一步很关键,利用jackson的Introspector机制,起到承上启下的作用
  • 判断字段上有自定义注解,然后使用自定义的JsonSerializer
  • 这样就把整个事情串起来了

单元测试

class PrintFieldJsonSerializerTest extends JsonSpringbootTestBase {private ObjectMapper objectMapper = new ObjectMapper();@SneakyThrows@Testvoid serialize() {objectMapper.setAnnotationIntrospector(new PrintFieldAnnotationIntrospector());DemoPerson demoPerson = DemoPerson.builder().name("zhangsan").email("zhangsan@163.com").build();String testResult = objectMapper.writeValueAsString(demoPerson);log.info("testResult: {}", testResult);assertTrue(StringUtils.isNotBlank(testResult));}
}

单元测试结果截图
在这里插入图片描述

总结

  • 实现一个需求的道路有千万条,对于一个有追求的程序员,研究源码,找到一条最精炼的路,用最简洁的方式实现目标,在可扩展性、可维护性方面都较优
  • 有需求的时候,不要着急写代码,研究下源码,可以帮助我们优雅的达到目的
  • 也许研究源码的时间远远大于写代码的时候,但收获和成就感还是很满足的
  • 即使最终仅用用几行代码实现需求,但一个优秀的程序员从来不是以代码的行数来衡量的
  • jackson的反序列化可以参考同样的原理来实现

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

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

相关文章

学习笔记|LED点亮原理|三极管在数字电路中的应用|Keil中的Tab设置|C51中对准双向口|STC32G单片机视频开发教程(冲哥)|第四集-上:点亮LED

文章目录 1.LED点亮原理STC32G12K128LQFP64QFN64管脚图&#xff1a;Tips&#xff1a;USB-ISP下载程GPIO (general purpose intput output&#xff09;Tips&#xff1a;三极管在数字电路中的应用 2 新建工程Tips:Tab设置TIPS: sbit c语言中特殊功能寄存器的位变量11.2 配置IO口注…

基于kubeasz部署高可用k8s集群

在部署高可用k8s之前&#xff0c;我们先来说一说单master架构和多master架构&#xff0c;以及多master架构中各组件工作逻辑 k8s单master架构 提示&#xff1a;这种单master节点的架构&#xff0c;通常只用于测试环境&#xff0c;生产环境绝对不允许&#xff1b;这是因为k8s集群…

5.0SMDJ24CA 瞬态抑制TVS二极管 可过4kV 2Ω测试

瞬态概述 浪涌描述的是存在于电源或信号线上uS级以上的脉冲。通常浪涌产生于雷击或开关瞬变能量。雷击能量可能是由于直击雷或感应雷作用于系统所产生的瞬变能量&#xff0c;开关瞬变能量通常由于配电系统的电源切换&#xff0c;或是负载的变化导致。 雷击浪涌测试目的 GB/T …

医疗保健中的 NLP:实体链接

一、说明 HEalthcare和生命科学行业产生大量数据&#xff0c;这些数据是由合规性和监管要求&#xff0c;记录保存&#xff0c;研究论文等驱动的。但随着数据量的增加&#xff0c;搜索用于研究目的的必要文件和文章以及数据结构成为一个更加复杂和耗时的过程。例如&#xff0c;如…

【学习FreeRTOS】第6章——FreeRTOS中断管理

【本篇文章的也可参考STM32中断文章http://t.csdn.cn/foF9I&#xff0c;结合着学习效果更好】 1.什么是中断 中断&#xff1a;让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断中断执行机制&#xff0c;可简单概括…

1、Java简介+DOS命令+编译运行+一个简单的Java程序

Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE JavaEE 企业版&#xff1a;包括技术有&#xff1a;Servlet、Jsp&#xff0c;以前称为J2EE JavaME 微型版&#xff1a;以前称为J2ME Java应用&#xff1a; Android平台应用。 大数据平台开发&#xff1a;Hadoo…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

采用pycharm在虚拟环境使用pyinstaller打包python程序

一年多以前&#xff0c;我写过一篇博客描述了如何虚拟环境打包&#xff0c;这一次有所不同&#xff0c;直接用IDE pycharm构成虚拟环境并运行pyinstaller打包 之前的博文&#xff1a; 虚拟环境venu使用pyinstaller打包python程序_伊玛目的门徒的博客-CSDN博客 第一步&#xf…

Chrome浏览器导出插件并安装到其他电脑浏览器上的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

绽放趋势:Python折线图数据可视化艺术

文章目录 一 json数据格式1.1 json数据格式认识1.2 Python数据和Json数据的相互转换 二 pyecharts模块2.1 pyecharts概述2.2 pyecharts模块安装 三 pyecharts快速入门3.1 基础折线图3.2 pyecharts配置选项3.2.1 全局配置选项 3.4 折线图相关配置3.4.1 .add_yaxis相关配置选项3.…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。…

【maven】通过profiles实现:怎样激活某个仓库、同时加载多个profile、不同环境加载不同依赖jar

文章目录 一. 基本用法二. 仓库激活方式1. 使用activeProfile激活2. 使用-P参数激活3. 使用-P参数不激活 三. 查看激活的仓库四. 不同环境依赖不同版本的jar Maven中的profile是一组可选的配置&#xff0c;可以用来设置或者覆盖配置默认值。有了profile&#xff0c;你就可以为不…