java - 抽象类及其子类型的 StdDeserializer

标签 java json jackson

假设有一个具有属性 a 的抽象类 A 和三个非抽象子类 B、C 和 D。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);
    }
}

这工作正常,但在从 FasterXML 迁移到 Jackson 2.4 之后 ObjectMapper不允许 ObjectNode作为它的 readValue 方法的参数。

当我修改代码使用 返回 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)

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

最佳答案

刚刚遇到了类似的问题,对我来说,所有问题都通过将 mapper.readValue(jp, requestClass) 替换为 mapper.treeToValue(root, requestClass)

关于java - 抽象类及其子类型的 StdDeserializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25503005/

相关文章:

java - java从服务器下载文件

java - 如何为 Java 客户端应用程序配置简单的 Web 缓存?

java - 如何将文本字段中一次可见的字符数限制为小于文本字段的宽度?

android - 如何在android中解析一个大的JSON文件

json - 如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?

java - Spring Boot 升级后 Jackson 序列化不起作用

java - 同时滚动 2 个 ListView

javascript - 如何使用 JSON 并通过 D3 返回数据

java - 在序列化期间对 URL 进行编码/解码的 Jackson 注释或方法?

java - 将 json 解析为 scala 案例类时出错