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

时间:2014-04-01 10:27:18

标签: java jackson

我需要提供Map的自定义反序列化,然后默认的序列化程序必须序列化每个Property对象。此地图是另一个对象的一部分:

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

我为PropertiesHolder类定义了mixin:

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

我也有用于Property类的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 ...
        }
    }
}

我看过How do I call the default deserializer from a custom deserializer in Jackson,但它并不适用于我......它以NPE结束。此外,帖子中描述的解决方案为外部类创建了反序列化器,对我来说,它被定义为mixin,我不想为此类创建反序列化器。

请指点我的解决方案。我在哪里可以获得Property对象的默认反序列化器?

由于

2 个答案:

答案 0 :(得分:0)

解决方案就是这行代码:

ObjectMapper mapper = (ObjectMapper)jp.getCodec();

在“deserialize(...)”方法中调用此方法。所以重要的(对我来说)代码片段是:

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

this博客上找到。

答案 1 :(得分:0)

问题是你需要一个完全构造的默认解串器;这需要一个构建,然后你的反序列化器可以访问它。 DeserializationContext不是你应该创造或改变的东西;它将由ObjectMapper

提供

所以你需要用deserialize()方法写的是:

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