当前位置: 首页 > 知识库问答 >
问题:

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

孟财
2023-03-14

我希望在Jackson中为Enum类的集合创建一个自定义反序列化器。因为自定义反序列化器的行为对于所有枚举都是相同的。我想为我的所有枚举类创建公共反序列化程序。

我尝试使一般自定义反序列化如下:

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;
    }
}

问题是我想在反序列化器中调用枚举静态方法,但无法这样做,因为我没有任何可用的类/枚举上下文信息。
你能帮我知道如何实现它吗?

共有1个答案

李烨
2023-03-14

我设法使以下解决方案奏效:

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

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;
    

} }

虽然现在,我无法提供严格的类型检查(创建实例时使用“

 类似资料:
  • 想象一下以下场景: 我想为Foo编写一个自定义的Jackson反序列化程序。为了做到这一点(例如,为了反序列化具有Foo的类 如何编写这样的反序列化程序?这应该是可能的,因为Jackson是通过键入集合和地图来实现的。 澄清: 似乎有两个部分可以解决这个问题: 1)获取内声明的属性类型并使用它来反序列化

  • 嗨下面这个问题 如何在Jackson中为泛型类型创建自定义反序列化器? 我想知道如何通过这个来解析 这就是我目前所拥有的 当我试图反序列化一点这个的时候,我得到了一个NPE

  • 我得到了。了解调用相同的反序列化器。是否有一种方法可以在custome反序列化器中使用或?

  • 我想反序列化表单中的类: 其中文本是加密的,反序列化应该在重建TestFieldEncryptedMessage实例之前取消对值的加密。 我采用的方法非常类似于:https://github.com/codesqueak/jackson-json-crypto 也就是说,我正在构建一个扩展SimpleModule的模块: 如您所见,设置了两个修饰符:EncryptedSerializerModif

  • 问题内容: 我正在尝试制作一个使用Jackson来反序列化POJO的类。 看起来像这样… 我对此实施有2个问题。 首先是我将类类型传递给方法,以便对象映射器知道应反序列化的类型。有使用泛型的更好方法吗? 同样在get方法中,我将一个从objectMapper返回的对象强制转换为T。这看起来特别讨厌,因为我必须在此处强制转换T,然后还必须从调用它的方法中强制转换对象类型。 我在该项目中使用了Robo

  • 我试图用Jackson库创建复杂类的对象。每个对象都有一个模式,反序列化器需要使用该模式来解释JSON。我的问题是如何向反序列化器提供模式? 反序列化程序扩展了类JSONDeserializer,该类具有无参数构造函数和必须重写的抽象方法反序列化(解析器、上下文)。我想改用另一种方法反序列化(解析器、上下文、值),其中值是部分构造的对象,其中包括模式。也就是说,反序列化方法可以调用value。sc