首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Jackson中创建自定义泛型反序列化器?

如何在Jackson中创建自定义泛型反序列化器?
EN

Stack Overflow用户
提问于 2020-06-27 16:51:09
回答 1查看 281关注 0票数 2

我希望在Jackson中为Enum类的集合创建一个自定义反序列化器。因为自定义反序列化器的行为对于所有枚举都是一样的。我想为我所有的枚举类制作通用反序列化器。

我尝试将通用自定义反序列化如下:

代码语言:javascript
复制
class MyEnumDeserialize<T> extends JsonDeserializer<T> {

    private Class beanClass;
    public MyEnumDeserialize() {
        
    }
    
    public MyEnumDeserialize(Class beanClass) {
        this.beanClass = beanClass;
    }
    @Override
    public T deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        TreeNode node = jsonParser.getCodec().readTree(jsonParser);
        T type = null;
        try{
            if(node.get("attr") != null){
               // I don't know how to call ENUM static method here as I don't have context information here
                if (type != null) {
                    return type;
                }
            }
        }catch(Exception e){
            type = null;
        }
        return null;
    }
}

问题是,我想在反序列化器中调用Enum静态方法,但是无法调用,因为我没有任何类/枚举上下文信息可用。

你能不能帮我知道我是怎么做到的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-28 13:16:54

不知何故,我设法使下列解决方案奏效:

我创建了一个模块并修改了EnumDeserializer,如下所示:

代码语言:javascript
复制
module.setDeserializerModifier(new BeanDeserializerModifier()
        {
          @Override public JsonDeserializer<?>  modifyEnumDeserializer(DeserializationConfig config,
                  JavaType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer)
          {
             
            if (beanDesc.getBeanClass().isEnum()) {
                 return new MyEnumDeserialize<>(beanDesc.getBeanClass());
            }
            return deserializer;
          }
        });

class MyEnumDeserialize<T extends Enum> extends JsonDeserializer<T> {

    private Class beanClass;
    public MyEnumDeserialize() {
        
    }
    
    public MyEnumDeserialize(Class beanClass) {
        this.beanClass = beanClass; 
    }
    @Override
    public T deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        TreeNode node = jsonParser.getCodec().readTree(jsonParser);
        T type = null;
        try{
            if(node.isValueNode()){
                ValueNode valueNode = (ValueNode)node;
                Method method = this.beanClass.getDeclaredMethod("get",short.class);
                type = (T)method.invoke(null, Short.parseShort(valueNode.asText()));
                if (type != null) {
                    return type;
                }
            }
        }catch(Exception e){
            type = null;
        }
        return type;

}}

尽管现在,我无法提供严格的类型检查(使用“<>”创建实例)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62612892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档