Jackson2.x自定义枚举值转换

本文探讨了在Java中扩展枚举并使用Jackson进行反序列化时遇到的问题,特别是如何创建一个通用的枚举转换器。作者指出,通过实现ContextualDeserializer接口并扩展Jackson ObjectMapper,可以解决需要为每个枚举类指定转换器以及在每个枚举属性上添加注解的痛点。文章还提到了在DeserializationContext中获取类对象的挑战,并提供了源码链接以供进一步研究。
摘要由CSDN通过智能技术生成

Java原生Enum太难用,对Enum进行扩展,添加了value属性,name属性;在用Jackson进行反序列化的时候遇到转换问题,简单的做法就是创建扩展枚举类转换器,在需要进行转换的属性上添加@JsonDeserialize注解。 这种做法有两个痛点:
​ 1.针对每个扩展的枚举类,都需要制定一个转换器。
​ 2.每个需要转换的枚举属性上都需要添加注解;
是否可以创建一个通用的扩展枚举类转换器,处理所有的枚举类呢。这里遇到本文难点,如何获取属性的类对象。很自然的想从DeserializationContext中获取,如下:

public abstract class DeserializationContext extends DatabindContext implements Serializable {
    ... 
    protected LinkedNode<JavaType> _currentType;
    ...
    public JavaType getContextualType() {
        return this._currentType == null ? null : (JavaType)this._currentType.value();
    }

​ 一开始尝试ctx.getContextualType().getRawClass()获取,但调用该方法一定会NullPointException;跟踪jackson源码后发现,发现ctx构造函数里里压根就不会初始化_currentType字段;不初始化放这里干嘛,一定别的用途,在DeserializationContext 发现有如下两个函数会给_currentType赋值。


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值