【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://xiahunao.cn/news/1383429.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Amazon CloudFront 部署小指南(五)- 使用 Amazon 边缘技术优化游戏内资源更新发布...

内容简介 游戏内资源包括玩家的装备/弹药/材料等素材&#xff0c;对游戏内资源的发布和更新是游戏运营商的一个常规业务流程&#xff0c;使用频率会十分高&#xff0c;所以游戏运营商希望该流程可以做到简化和可控。针对这个需求&#xff0c;我们设计了 3 个架构&#xff0c;面…

Adobe2021/20年11月更新推送

以下更新vposy带来的Adobe11月份更新推送&#xff0c;是部分小版本BUG修复更新&#xff0c;安装新版的建议更新一下以获取更好的使用体验&#xff0c;软件获取方式位于为文末。 版本更新简要 Photoshop 22.0.1 此更新包含对多个崩溃问题和工作流程错误的修复 After Effects…

Adobe 系列软件安装及激活异常解决方法

很多小伙伴安装 Adobe 的软件出现这样那样的的异常&#xff0c;希望通过这篇文章&#xff0c;可以帮大家解决问题。 安装前需要做什么&#xff1f; 如果安装过其它版本的 Adobe 软件&#xff0c;请使用 Adobe 官网卸载工具Adobe Creative Cloud Cleaner Tool卸载干净&#xf…

Adobe2021 4月份更新推送

前言 今天又又又给各位带来了vposy大神河蟹制作的Adobe 4月份更新推送 小编整理了一下供大家查阅&#xff0c;追新版本的可以更新一下&#xff0c;以获取更好的使用体验 大多更新都是提升稳定性修复Bug…… 配置要求 新版本整体对系统要求最低为Win10的1903版本&#xff0…

【EM算法推导】

# 一、必备的基础知识 EM算法用到了大量的概率论与数理统计的知识&#xff0c;必须对基础有一定掌握才能完成EM算法的推导。 ## 1.1 最大似然估计 思想&#xff1a;我们观测到了一组样本&#xff0c;为什么我们能观测到这一组样本呢&#xff1f;因为这一组样本出现的概率比较大…

18-有假币

题目 居然有假币&#xff01; 现在猪肉涨了&#xff0c;但是农民的工资却不见涨啊&#xff0c;没钱怎么买猪肉啊。nowcoder这就去买猪肉&#xff0c;结果找来的零钱中有假币&#xff01;&#xff01;&#xff01;可惜nowcoder 一不小心把它混进了一堆真币里面去了。只知道假币…

Java项目-苍穹外卖-Day03

员工分页查询功能实现 需求分析和设计 代码开发 先设计类 将对应分页查询的传参类以及结果类进行封装 对应真正返回的为Result<PageResult>Controller /**** param employeePageQueryDTO* return*/GetMapping("/page")ApiOperation("员工分页查询&qu…

什么是CSS Grid布局?什么是Flexbox布局?它们两者有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS Grid布局⭐ Flexbox布局⭐ 不同之处⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web…

QT 如何绘制圆形进度条

QT绘制圆形进度条&#xff0c;不同于QPainterPath方式&#xff0c;直接使用 drawArc 函数效果也是出奇的好&#xff01; void Widget::paintEvent(QPaintEvent *event) {QPainter p(this);p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);QRect rc t…

android实现圆形进度条

/*** date:2021/1/4 0004* author:wsm (Administrator)* funcation:圆形进度条控件*/public class CircleProgressView extends View {private Paint mBackPaint, mProgPaint; // 绘制画笔private RectF mRectF; // 绘制区域private int[] mColorArray; // 圆环渐变色…

uniapp圆形进度条

插件下载地址&#xff1a;https://ext-resource-aliyun.dcloud.net.cn/marketplace/206a8e50-63cb-11ec-8e77-a3fa77cd6ec0/1.1.2/plugin.zip?v1668747036 一、下载并解压&#xff0c;复制到uniapp的components下 二、使用 import导入组件 import circleProgressBar from /…

超简单的Android圆形进度条

效果图&#xff1a; 代码优化/简化、教科书级别注释、复制粘贴即可用 代码&#xff1a; package com.zistone.factorytest0718.view;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; impor…

Android 绘制圆形进度条

Android 绘制圆形进度条 最近项目上有一些需求&#xff0c;需要绘制圆形的进度条满足设计上和交互上的需求&#xff1a; 实现思路 在画布上直接绘制View&#xff0c;需要了解一下几点 1.需要画一个圆 2.圆圈上有不同进度的颜色 3.圆圈中有进度数字的展示 4.圆圈中间还…

纯css制作圆形进度条

效果图大概是这样的 第一步 先定义出一个方形盒子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

实现一个圆形进度条(vue)

实现方式&#xff1a;首先是用svg画两个圆&#xff0c;同圆心同半径的两个圆&#xff0c;然后把颜色都设置成透明&#xff0c;利用圆的边框来实现。给两个圆设置相同的边框宽度&#xff0c;并且设置颜色&#xff08;设置一个透明&#xff0c;一个有颜色&#xff09;&#xff1b…

药都银行冲刺上交所:年营收22.78亿 古井集团是股东

雷递网 雷建平 5月1日 亳州药都农村商业银行股份有限公司&#xff08;简称&#xff1a;“药都银行”&#xff09;日前递交招股书&#xff0c;准备在上交所主板上市。 药都银行计划募资16.38亿元。 年营收22.78亿 药都银行坐落于世界中医药之都——亳州市&#xff0c;于2005年12…

自贸港首家公务机公司海航金鹿商务正式启动运营

日前&#xff0c;海航集团旗下金鹿公务在海口设立公务机总部 -- 金鹿商务航空有限公司&#xff08;简称&#xff1a;金鹿商务&#xff09;&#xff0c;已通过中国民用航空海南安全监督管理局运行审定&#xff0c;取得中国民用航空中南地区管理局颁发的运行规范。4月29日上午9时…

内网通朋友不在线

前段时间使用内网通发现同学老师的总是不在线&#xff0c;有时候改一下IP地址&#xff0c;又可以&#xff0c;后面才发现原来可以自己设置网段地址的 设置过程见下图&#xff1a; 输入老师的IP地址的前三位即可

基于html5在线学生学籍信息管理系统

随着高校人数越来越多&#xff0c;管理高校的学生人数成为难题&#xff0c;如何更好的管理高校的入学人数&#xff1f;通过学籍的管理方式可以很好的将各年级&#xff0c;各个院校&#xff0c;各个专业的学生进行统一的管理&#xff0c;对不同的学生分门别类&#xff0c;学籍管…

爱班级电脑端下载|二维码签到

最近上网课发现爱班级的扫码功能只能在手机上进行&#xff0c;如果手动点到有时候还是会显示我没考勤&#xff0c;那有没有电脑端的爱班级下载呢&#xff1f;搜了很久发现是有的&#xff0c;但是要装个模拟器&#xff1a; 1.下载链接如下&#xff1a; 网盘链接&#xff1a; …