返回顶部
首页 > 资讯 > 精选 >Jackson多态序列化怎么实现
  • 295
分享到

Jackson多态序列化怎么实现

2023-07-02 11:07:38 295人浏览 安东尼
摘要

这篇文章主要介绍“Jackson多态序列化怎么实现”,在日常操作中,相信很多人在Jackson多态序列化怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jackson多态序列化怎么实现”的疑惑有所帮助!

这篇文章主要介绍“Jackson多态序列化怎么实现”,在日常操作中,相信很多人在Jackson多态序列化怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jackson多态序列化怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

场景

做一个消息中心,专门负责发送消息。消息分为几种渠道,包括手机通知(Push)、短信(SMS)、邮件(Email),websocket等渠道。

我定义了一个基类MessageRequest用来接收请求参数,代码如下:

public class MessageRequest implements Serializable {  protected MessageChannel channel;  private MessageRequest(){}  protected MessageRequest(MessageChannel channel){    this.channel = channel;  }    public MessageChannel getChannel() {    return this.channel;  }}

MessageRequest中有个属性channel是枚举MessageChannel,该枚举列举所有渠道,代码如下:

public enum MessageChanne {  PUSH,  EMAIL,  WEBSocket,  SMS,  ;    MessageChannel() {}}

MessageRequest有各种渠道的子类实现,以Push为例:

public class PushMessageReuqest extends MessageRequest {  public PushMessageRequest() {    super(MessageChannel.PUSH);  }    private String title;  // 省略其他字段以及getter、setter方法  ...}

我在接口入参使用MessageRequest接收:

public class MessageController {  @PostMapping("/sendMessage")  public R<Object> sendMessage(MessageRequest request) {    System.out.println(request);  }}

使用postman发送push请求之后发现后端收到的类型还是基类,并且title字段丢失。

Jackson多态序列化怎么实现

Jackson多态序列化怎么实现

这与我预想的不符,因为客户端知道渠道,构建对应的渠道消息体给我就好了啊!为什么类型被擦除了呢?我的想法就是发送push请求啊。。。。。后来才知道序列化之后在反序列化的时候不知道给你反序列化成什么类型,序列化工具也没有聪明到能根据你的channel属性就知道是什么类型,但是我又想这样做。那么怎么办呢????

Jackson多态类型序列化/反序列化

经过查询资料以及咨询了一下领导,发现了@JSONTypeInfo@jsonSubTypes两个注解。

@JsonTypeInfo作用于类/接口,被用来开启多态类型处理,它有一些属性:

  • use(必选):定义使用哪一种类型标识码,有以下几个可选项。

    • NONE:不使用识别码

    • CLASS:使用完全限定类名做识别码

    • MINIMAL_CLASS:使用类名(忽略包名)做识别码,和基类在同一个包可用

    • NAME:指定名称

    • CUSTOM:自定义识别码,由@JsonTypeIdResolver对应

  • include(可选):指定识别码如何被包含进去,有以下几个可选项。

    • PROPERTY:作为兄弟属性加入,默认值

    • WRAPPER_OBJECT:作为一个包装的对象

    • WRAPPER_ARRAY:作为包装的数组

    • EXTERNAL_PROPERTY:作为扩展属性

    • EXISTING_PROPERTY:作为已存在的属性(符合我的场景,用channel)

  • property(可选):指定识别码的属性名称。该属性只有当use为CLASS(不指定默认为@class)、MINIMAL_CLASS(不指定默认为@c)、NAME(不指定默认为@typeinclude为PROPERTY、EXISTING_PROPERTY、EXTERNAL_PROPERTY时才有效。

  • defaultImpl(可选):如果类型识别码不存在或者无效,可以使用该属性来指定反序列化时使用的默认类型。

  • visible(可选,默认false):属性定义了类型标识符是否会成为反序列化器的一部分,默认为false,也就是说Jackson会从json内容中删除类型标识再传递给JsonDeserializer。

@JsonSubTypes作用于类/接口,用来列出给定类/接口的子类。一般配合@JsonTypeInfo使用

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "channel")@JsonSubTypes({  @JsonSubTypes.Type(value = PushMessageRequest.class, name = "PUSH"),  @JsonSubTypes.Type(value = EmailMessageRequest.class, name = "EMAIL")})

JsonSubTypes的值是一个@JsonSubTypes.Type[]数组,参数value表示类型,参数name表示@JsonTypeInfo注解中property属性的值,对比以上代码即:channel = "PUSH"或channel = "EMAIL"。name为可选值,不指定时需在子类提供JsonTypeName注解并指定value属性。

实战

改造上面提供的MessageReuqest

// include默认为PROPERTY,这里可以不加@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "channel")@JsonSubTypes({  @JsonSubTypes.Type(value = PushMessageRequest.class, name = "PUSH"),  @JsonSubTypes.Type(value = EmailMessageRequest.class, name = "EMAIL")})public class MessageRequest implements Serializable {    protected MessageChannel channel;    private MessageRequest(){}    protected MessageRequest(MessageChannel channel){    this.channel = channel;  }    public MessageChannel getChannel() {    return this.channel;  }}

Jackson多态序列化怎么实现

此时通过postman请求发现入参类型有了变化

Jackson多态序列化怎么实现

Jackson多态序列化怎么实现

include属性使用默认的PROPERTY时发现序列化之后的json会多出来一个属性,属性名对应的就是@JsonTypeInfoproperty的值。虽然不影响使用,但是我看着很不舒服。基于我这种情况可以使用include=EXISTING_PROPERTY

Jackson多态序列化怎么实现

到此,关于“Jackson多态序列化怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Jackson多态序列化怎么实现

本文链接: https://lsjlt.com/news/341498.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Jackson多态序列化怎么实现
    这篇文章主要介绍“Jackson多态序列化怎么实现”,在日常操作中,相信很多人在Jackson多态序列化怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jackson多态序列化怎么实现”的疑惑有所帮助!...
    99+
    2023-07-02
  • jackson多态反序列化怎么实现
    在Jackson中,实现多态反序列化可以使用@JsonTypeInfo注解和@JsonSubTypes注解。 首先,在父类上使用...
    99+
    2023-10-22
    jackson
  • Jackson多态序列化图文详解
    目录场景Jackson多态类型序列化/反序列化实战总结场景 做一个消息中心,专门负责发送消息。消息分为几种渠道,包括手机通知(Push)、短信(SMS)、邮件(Email),Webs...
    99+
    2024-04-02
  • Java怎么用Jackson序列化实现数据脱敏
    这篇“Java怎么用Jackson序列化实现数据脱敏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么用Jackso...
    99+
    2023-07-05
  • springboot jackson自定义序列化和反序列化实例
    目录jackson自定义序列化和反序列序列化JsonSerializer最后请求http返回对象反序列化JsonDeserializer小结一下springboot 自定义序列化器j...
    99+
    2024-04-02
  • Java利用Jackson序列化实现数据脱敏
    几天前使用了Jackson对数据的自定义序列化。突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录。 核心思想是利用Jackson的StdSerializer,@JsonS...
    99+
    2024-04-02
  • Java整合Jackson实现反序列化器流程
    目录1. 实体类2. 反序列化器3. 序列化器在使用 Jackson 时很多时候在自定义的数据结构时通过本身自带的序列化器可能实现不了自定义的结构转换,比如:需要从Json 字符串中...
    99+
    2023-01-14
    Java Jackson反序列化器 Java Jackson Java反序列化器
  • Jackson反序列化时怎么实现大小写不敏感设置
    这篇文章主要讲解了“Jackson反序列化时怎么实现大小写不敏感设置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Jackson反序列化时怎么实现大小写不敏感设置”吧!常用配置ObjectM...
    99+
    2023-06-20
  • Java利用Jackson序列化实现数据脱敏详解
    目录1.背景2.目标3.主要实现3.1基于Jackson的自定义脱敏序列化实现3.2定义脱敏接口、以及工厂实现3.3常用的脱敏器实现3.4注解定义3.5定义脱敏符号4.使用样例&am...
    99+
    2023-05-13
    Java Jackson序列化实现数据脱敏 Java Jackson序列化 Java 数据脱敏
  • Java序列化与反序列化怎么实现
    本篇内容主要讲解“Java序列化与反序列化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java序列化与反序列化怎么实现”吧!序列化与反序列化概念序列化 (Serialization)是...
    99+
    2023-06-02
  • Jackson 反序列化时实现大小写不敏感设置
    常用配置 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(Feature.IGNOR...
    99+
    2024-04-02
  • Python中怎么实现序列化与反序列化
    这篇文章给大家介绍Python中怎么实现序列化与反序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python序列化与反序列在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict:d =&n...
    99+
    2023-06-15
  • Java的序列化与反序列化怎么实现
    本篇内容介绍了“Java的序列化与反序列化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java对象的序列化Java平台允许我们在内...
    99+
    2023-07-04
  • VB.NET中怎么实现序列化
    这篇文章给大家介绍VB.NET中怎么实现序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先是定义数组:Dim nums(10) As Integer 然后是生成数组内容:D...
    99+
    2023-06-17
  • 怎么用java实现序列化
    这篇文章主要介绍怎么用java实现序列化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!package test;import java.io.*;public class Test implements Serial...
    99+
    2023-06-03
  • 小程序多图列表怎么实现性能优化
    小编给大家分享一下小程序多图列表怎么实现性能优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么造成的性能问题简单的来说: D...
    99+
    2024-04-02
  • Java中怎么实现对象的序列化和反序列化
    这篇文章给大家分享的是有关Java中怎么实现对象的序列化和反序列化的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。引言:序列化是将对象的状态信息转换为可以存储或传输的形式的过程,在...
    99+
    2024-04-02
  • Json字符串的序列化与反序列化怎么实现
    今天小编给大家分享一下Json字符串的序列化与反序列化怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • C#的XML序列化怎么实现
    这篇文章主要讲解了“C#的XML序列化怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#的XML序列化怎么实现”吧!C# XML序列化实现实例:假设有一个类public c...
    99+
    2023-06-17
  • java中序列化Serializable怎么实现
    要实现Java中的对象序列化,需要按照以下步骤进行:1. 在需要进行序列化的类上实现`Serializable`接口。`Serial...
    99+
    2023-09-14
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作