我需要提供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对象的默认反序列化器?
由于
答案 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));