如何从自定义反序列化器调用默认解析器(在映射器中注册)

我需要提供Map的自定义反序列化,然后每个属性对象都必须通过默认的序列化程序进行序列化。该地图是另一个对象的一部分:

class PropertiesHolder {
    Map<String, Property> properties;
}

我已经为PropertiesHolder类定义了mixin:

class PropertiesHolderMixIn {
    @JsonSerialize(using=PropertiesSerializer.class)
    @JsonDeserialize(using=PropertiesDeserializer.class)
    Map<String, Property> properties;
}

我也有Propertyin类的mixin。ObjectMapper初始化:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setMixInAnnotation(Property.class, PropertyMixIn.class);
module.setMixInAnnotation(PropertiesHolder.class, PropertiesHolderMixIn.class);
mapper.registerModule(module);

我的反序列化器:

class PropertiesDeserializer extends JsonDeserializer<Map<String, Property>> {
    public Map<String, Property> deserialize(JsonParser jp, DeserializationContext ctxt) throws ... {
        ArrayNode node = (ArrayNode) jp.readValueAsTree();
        for (int i = 0, size = node.size() ; i < size ; i++) {
            ObjectNode jn = (ObjectNode) node.get(i);
            String key = jn.get("propertyName").textValue();
            String value = jn.get("propertyValue").toString();
            ... HERE I need to call registered deserializer for Property class over value ...
        }
    }
}

我看过如何从Jackson的自定义解串器中调用默认解串器,但是对我来说这是行不通的...它以NPE结尾。另外,文章中描述的解决方案为外部类创建了反序列化器,在我看来,该类被定义为mixin,而我也不想为此类创建反序列化器。

请给我指出一个解决方案。在哪里可以获取Property对象的默认反序列化器?

谢谢

Dinesh Chitlangia

问题在于您将需要一个完全构造的默认解串器;这需要先构建一个,然后您的解串器才能访问它。DeserializationContext不是您应该创建或更改的东西;它将由ObjectMapper

因此,您需要在该deserialize()方法中编写的只是:

ObjectMapper mapper = (ObjectMapper)jp.getCodec();
Property property = mapper.readValue(jn.get("propertyValue").toString(), Property.class));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章