gpt4 book ai didi

java - Jackson Fasterxml : how to parse abstract class' children? 混合?

转载 作者:行者123 更新时间:2023-11-30 06:16:50 28 4
gpt4 key购买 nike

我们通过xcj使用从模式生成的对象类型。 因此,对类型定义的控制不是很灵活。我们还使用 JAXB 注释。

然后,我们使用 Jackson Faster XML 来反序列化这些对象。不幸的是,当我们反序列化抽象类时,我们得到一个异常:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of 
com.x.y.z.AnstractType: abstract types either need to be mapped to concrete types,
have custom deserializer, or contain additional type information at
[Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@2989b3db;
line: 1, column: 625] (through reference chain: com.x.y.z.TypeA["type-b-prop"]->
com.x.y.z.TypeB["type-c-prop"]->java.util.ArrayList[0]->
com.x.y.z.TypeC["abstract-type-prop"]->java.util.ArrayList[0])

对于抽象类的单个子类,通过添加 mixin 可以轻松解决上述问题:

@JsonTypeInfo(defaultImpl = ChildType.class, use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
static class AbstractTypeMixIn {
}

并将其注册到对象映射器中:

objectMapper = new ObjectMapper();
objectMapper.addMixIn(AbstractType.class, AbstractTypeMixIn.class);
...
objectMapper.registerModule(new JaxbAnnotationModule());

当单个类继承抽象类时,这就像一个魅力。多个 child 怎么办?知道如何为抽象类的多个继承者实现它吗?如果不是 mixin,还有什么?

最佳答案

问题是我仅使用 mixin 来解析响应,而不是编写它。因此,解决方案是为对象映射器序列化和反序列化使用相同的mixins。下面的定义就足够了:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
static class AbstractTypeMixIn {
}

它只是在 JSON 中为不明确的子类添加 @type 属性。

关于java - Jackson Fasterxml : how to parse abstract class' children? 混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014713/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com