当前位置: 首页 > 知识库问答 >
问题:

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

吴康平
2023-03-14

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

我想为抽象类A的子类StdDeserializer能够根据要反序列化的属性的存在来决定选择哪个子类。

我以前用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 ObjectMapper迁移到Jackson 2.4后,不允许ObjectNode作为其readValue方法的参数。

当我修改代码以使用返回映射器时。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以避免耗尽其输入源看起来很复杂。

共有1个答案

苏淇
2023-03-14

只是遇到了类似的问题,对我来说,这一切都是通过将mapper.readValue(jp,请求类)替换为mapper.treeToValue(root,请求类)

 类似资料:
  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 假设您有以下抽象java类: 以及以下子类层次结构: 假设您需要在超类上的给定点使用泛型类型,例如,为了在构造函数上使用gson库将请求json反序列化到特定的请求对象,如下所示: 您需要变量“typeOfI”中的泛型I类型 是否有一个全局解决方案,允许获得由尊重以下约束的具体子类指定的泛型类型? 该类型是在运行时获取的,与子类的层次结构无关(这个问题的示例可能更复杂) 开发人员只需要定义泛型来扩

  • 我的(简化)情况: Service@webservice 容器getContainer()@webmethod 容器 无效setObjects(ContainableObjects[]objects) ContainableObjects[]getObjects() ContainedInt[extends ContainableObject] void setValue(int value) i

  • 我一直在浏览打字教程来学习打字类。我被困在理解(和,就此而言)。 我遇到的问题是: > 《pedia》说,“可选类型类是为同样具有幺半群结构的应用程序函子设计的。”我不明白,替代品不是意味着完全不同于单倍体吗?i、 e.我理解另类类的意义在于在两个事物之间进行选择,而我理解幺半群是关于组合事物的。 为什么Alternative需要一个

  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边

  • “绑定不匹配:Team类型不是league类型 的有界参数 >的有效替代品。”