Jackson 自定义序列化器的使用

news2024/12/24 0:53:12

注意:从简单的例子去延伸使用,内容紧凑,排版就这样了哈

举例:自定义序列化器,让输出json的指定字段金额×10

public class testMain {
    public static void main(String[] args) throws JsonProcessingException {
        Bill bill = new Bill();
        bill.setAmount(1.0);
        bill.setName("张三");
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(bill);
        System.out.println(s);
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Bill {

        private String name;

        private Double amount;
    }
}

输出结果:
在这里插入图片描述

做法:实现接口JsonSerializer,自定义一个序列化器

在这里插入图片描述

刚才指定的字段是Double类型的,那如果是List类型呢?

笨方法:再指定一个新的序列化器,然后不同的类型指定不同的序列化器

在这里插入图片描述

能否简化?指定同一个类,然后根据具体的类型去返回到具体的序列化器

实现接口ContextualSerializer,判断类型然后返回具体的序列化器

    public static class CrrencyJsonSerializerimplements ContextualSerializer{

        @Override
        public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
            Class<?> rawClass = beanProperty.getType().getRawClass();
            return ClassUtil.isAssignable(rawClass,Double.class)?new CrrencyDoubleJsonSerializer():new CrrencyDoubleListJsonSerializer();
        }
    }

但是使用的话会发现不能使用,是因为这个接口并没有实现JsonSerializer类
在这里插入图片描述

解决方法,实现JsonSerializer类

  public static class CrrencyJsonSerializer extends JsonSerializer<Object> implements ContextualSerializer{

        @Override
        public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
            Class<?> rawClass = beanProperty.getType().getRawClass();
            return ClassUtil.isAssignable(rawClass,Double.class)?new CrrencyDoubleJsonSerializer():new CrrencyDoubleListJsonSerializer();
        }

        @Override
        public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

        }
    }

在这里插入图片描述

方法解析:这里面的serialize重写方法是会在JsonSerializer方法后面执行,所以这块的serialize方法是无用的,当然还可以更简化

在这里插入图片描述

本身作为double类型的序列化器,然后判断类型如果不是double再走List的序列化器

还能延伸!接着简化

如果我不想用@JsonSerialize(using = CrrencyJsonSerializer.class)注解去标识呢?我觉得太繁琐,我想使用自定义注解去搞

走起!
1.定义一个自定义注解:

    @Target({ElementType.METHOD,ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    //该注解是标注是json注解,底层实现,不加的话不会生效
    @JacksonAnnotationsInside
    //在这去使用这个注解
    @JsonSerialize(using = CrrencyJsonSerializer.class)
    public @interface ExchangeRate{

    }

2.使用
在这里插入图片描述
是不是更简洁了!

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

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

相关文章

【BP靶场portswigger-服务端5】业务逻辑漏洞-11个实验(全)

目录 一、业务逻辑漏洞 1、意义 2、业务逻辑漏洞的产生 3、产生的影响 二、过度信任客户端控件 1、简述 实验1&#xff1a;过度信任客户端控件 三、未处理非常规输入 1、简述 实验2&#xff1a;高级逻辑漏洞 实验5&#xff1a;低级逻辑缺陷 实验6&#xff1a;异常输入处…

服务器防勒索病毒经验分享

场景描述 互联网飞速发展&#xff0c;各企业均搭建了自己的服务器。包括文件服务器、代码服务器、业务系统服务器、数据库服务器等。目前大多数企业使用的服务器系统以Windows Server和Linux&#xff08;Centos&#xff09;居多&#xff0c;但随着国产操作系统的崛起&#xff…

Altium Designer 20 凡亿教育视频学习-03

第三部分学习 封装具备的元素 紫色部分就是阻焊部分&#xff0c;阻焊作用&#xff1a;防止绿油覆盖 封装制作 Tab键调出属性菜单 当放置焊盘的时候&#xff0c;按Tab键&#xff0c;可以打开属性面板&#xff0c;并且更改是贴片还是插孔的 测量距离 Ctrl M 测量功能 测量…

Day 17-其它 Composition API_ 依赖注入provide / inject

Provide / Inject 当我们需要从父组件向子组件传递数据时&#xff0c;我们使用 props可以实现&#xff01; 想象一下这样的结构&#xff1a;有一些深度嵌套的组件&#xff0c;而深层的子组件只需要父组件的部分内容。在这种情况下&#xff0c;如果仍然将 props 沿着组件链逐级…

CORS 跨域资源共享

目录 1. 接口的跨域问题 2. 使用 cors 中间件解决跨域问题 3. 什么是 CORS 4. CORS 的注意事项 5. CORS 响应头部 - Access-Control-Allow-Origin 6. CORS 响应头部 - Access-Control-Allow-Headers 7. CORS 响应头部 - Access-Control-Allow-Methods 8. CORS请求的…

SpringMVC程序详解

1.什么是 Spring MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“Spring MVC”。 从上述定义我们可以得…

消息服务 + Serverless 函数计算如何助力企业降本提效?

作者&#xff1a;柳下 背景介绍 消息队列服务&#xff08;下文均以 Message Service 命名&#xff09;作为云计算 PaaS 领域的基础设施之一&#xff0c;其高并发、削峰填谷的特性愈发受到开发者关注。Message Service 对上承接消息生产者服务的请求&#xff0c;对下连接消费者…

指令格式与寻址方式

指令与指令系统 指令: 控制计算机完成某种操作的命令。 指令系统&#xff1a; 处理器所能识别的所有指令的集合。 指令的兼容性&#xff1a; 同一系列机的指令都是兼容的。 汇编语言&#xff1a; 指令助记符。 指令格式 例如&#xff1a; 寻址方式 操作数可能的来源或…

SpringCloud(11)— 微服务保护(Sentinel)

SpringCloud&#xff08;11&#xff09;— 微服务保护(Sentinel) 一 认识Sentinel 1.雪崩问题及其解决方案 微服务调用链路中的某个服务出现问题&#xff0c;引起整个链路中所有的微服务都不可用&#xff0c;这就是我们常说的雪崩问题。 如何解决雪崩问题&#xff1f; 常见…

Qt之实现自定义控件的两种方式——插件法

文章目录前言一、需求二、实现1、新建项目2、自定义控件类3、编译插件4、拖拽使用&#xff08;1&#xff09;在designer.exe中直接拖拽&#xff08;2&#xff09;在Qt Creator的设计师中直接拖拽5、在项目中正常使用前言 可以通过Qt设计师拖拽原生控件进行界面开发&#xff0c;…

【Linux】操作系统及进程概念

大家好我是沐曦希&#x1f495; 文章目录一、冯诺依曼体系结构二、操作系统OS三、系统调用和库函数概念四、进程1.概念2.描述进程-PCB3.查看进程4.查看系统调用5.查看进程调用6. 通过系统调用创建进程-fork初识一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我…

外贸业务员该如何拓客?

最近几个月&#xff0c;做外贸的朋友都来吐槽&#xff0c;外贸干不下去了。一个B2B店铺和Google推广要花很多钱&#xff0c;竞争太激烈了。投入和产出极不成比例&#xff0c;就问我能不能解决。我也是行业出身。我问他们有没有听说过以下五种实惠高效的营销方式。然后我就想告诉…

JWT的组成以及工作原理

什么是 JWT? JWT &#xff08;JSON Web Token&#xff09; 是目前最流行的跨域认证解决方案&#xff0c;是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出&#xff0c;JWT 本身也是 Token&#xff0c;一种规范化之后的 JSON 结构的 Token。 JWT 自身包含了身份验证…

SpringBoot项目中基本常用依赖分享(个人向)

目录 &#xff08;1&#xff09;spring-boot-starter-web &#xff08;2&#xff09;mysql-connector-java &#xff08;3&#xff09;mybatis-spring-boot-starter &#xff08;4&#xff09;mapper-spring-boot-starter &#xff08;5&#xff09;mybatis-plus-boot-st…

数组string

数组 目录&#xff1a;数组一维数组一维数组的定义和初始化一维数组数据元素的访问练习1 找小猪练习2 算平均值比较两个数组是否相等一维数组冒泡法排序一维数组操作一维数组查找元素**普通查找**&#xff1a;二分查找&#xff1a;二分查找 最小下标最大下标查找元素个数一维数…

如何优化 MySQL

为什么要对 SQL 进行优化 有时候数据库会出现性能低、执行时间太长、等待时间太长、SQL 语句欠佳&#xff08;连接查询&#xff09;、索引失效等问题&#xff0c;这些问题会严重拖慢一个系统的速度&#xff0c;因此需要对 SQL 进行优化。 SQL 的编写过程和解析过程并非是一致…

Qt样式表语法

样式规则每个样式规则由选择器和声明组成。选择器&#xff1a;指定受该规则影响的部件。声明&#xff1a;指定这个部件上要设置的熟悉如&#xff1a;QPushButton{color:red} QPushButton是选择器&#xff1b;{color:red}是声明&#xff1b;color是属性&#xff1b;red是值。选择…

使用prometheus监控ES

下载elasticsearch_exporter wget 下载二进制包并解压、运行&#xff1a; wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.linux-a…

ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

本文利用6818开发板完成LCD屏上绘制任意的矩形&#xff0c;圆形&#xff0c;三角形或五角星形图案&#xff0c;还有绘制太极&#xff0c;五星红旗的方案。 目录 映射 绘制矩形 代码思路 代码实现 实践出真知 绘制圆形 代码思路 代码实现 绘制三角形 代码思路 代码实现…

【回答问题】ChatGPT上线了!用给写出可执行的实体链接模型

如何实现一个实体链接模型/代码 在实现实体链接模型之前&#xff0c;您需要确定所要链接的实体类型&#xff08;例如人名、地名、组织机构等&#xff09;。然后&#xff0c;您需要准备一份包含大量实体及其相应识别码的实体百科数据集。接着&#xff0c;您可以使用深度学习模型…