用于抽象类及其子类型的StdDeserializer

Chr*_*oph 5 java json jackson

假设有一个具有属性a和三个非抽象子类B,C和D的抽象类A。B没有其他属性,C包含属性c,D包含属性c和d。

我希望将StdDeserializer子类化为抽象类A,以便能够基于要反序列化的属性的存在来决定选择哪个子类。

我之前是从Codehaus发行的Jackson版本中做到这一点的,并且使用以下实现工作正常:

class AbstractADeserializer extends StdDeserializer<A> {
    AbstractADeserializer () {
        super(A.class);
    }

    @Override
    public A deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        ObjectMapper mapper = (ObjectMapper) jp.getCodec();
        ObjectNode root = (ObjectNode) mapper.readTree(jp);
        Class<? extends A> requestClass = null;

        // root.getFieldNames() is an iterator over all field names
        JsonNode cValue = root.findValue("c");
        JsonNode dValue = root.findValue("d");

        /*
         * Check for existence of required fields and choose the
         * corresponding request class.
         */
        logger.debug(Boolean.toString(c != null));
        logger.debug(Boolean.toString(d != null));

        if(c != null && d == null) {
            logger.debug("Found C");
            requestClass = C.class;
        } else if(c != null && d != null) {
            logger.debug("Found D");
            requestClass = D.class;
        } else {
            logger.debug("Found B");
            requestClass = B.class;
        }

        return mapper.readValue(root, requestClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但是从FasterXML ObjectMapper迁移到Jackson 2.4后,不允许ObjectNode作为其readValue方法的参数。

当我修改代码以使用return mapper.readValue(jp,requestClass); 我总是

    com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
     at [Source: org.apache.catalina.connector.CoyoteInputStream@1286ec89; line: 1, column: 559]
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
        at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3095)
        at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3009)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1637)
Run Code Online (Sandbox Code Playgroud)

您看到了哪些替代方案可以灵活地确定给定输入的类,而无需手动反序列化对象?对我而言,克隆JsonParser看起来很复杂,以避免耗尽其输入源。

Dav*_*ave 5

刚刚遇到类似的问题,对我来说,这一切都通过替换来mapper.readValue(jp, requestClass)解决mapper.treeToValue(root, requestClass)