簡體   English   中英

如何從自定義反序列化器調用默認解析器(在映射器中注冊)

[英]how to call default parser (registered in mapper) from custom deserializer

我需要提供Map的自定義反序列化,然后默認序列化程序必須對每個Property對象進行序列化。 該地圖是另一個對象的一部分:

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對象的默認反序列化器?

謝謝

解決方案是以下代碼行:

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

在“ deserialize(...)”方法中調用此方法。 因此,重要的(對我而言)代碼片段是:

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

博客上找到。

問題是您將需要一個完全構造的默認解串器; 這需要先構建一個,然后您的解串器才能訪問它。 DeserializationContext不是您應該創建或更改的東西; 它將由ObjectMapper提供

因此,您需要在deserialize()方法中編寫的全部內容是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM