Jackson Faster XML:如何解析摘要 class' children?混合?
Jackson Faster XML: how to parse abstract class' children? Mixins?
我们使用通过 xcj
从模式生成的 object 类型。 因此,对类型定义的控制不是很灵活。我们还使用 JAXB 注释。
然后,我们使用 Jackson Faster XML 对那些 object 进行反序列化。不幸的是,当我们反序列化抽象 classes 时,我们得到一个异常:
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])
对于摘要 class 的 single child 通过添加 mixin 可以轻松解决上述问题:
@JsonTypeInfo(defaultImpl = ChildType.class, use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
static class AbstractTypeMixIn {
}
并在 object 映射器中注册它:
objectMapper = new ObjectMapper();
objectMapper.addMixIn(AbstractType.class, AbstractTypeMixIn.class);
...
objectMapper.registerModule(new JaxbAnnotationModule());
当单个 class 继承抽象时,这就像一个魅力。多个 children 呢?知道如何为抽象 class 的多个继承者实现它吗?如果不是 mixins,还有什么?
@JsonSubTypes
注释可能对您有用。详见
问题是我只使用 mixin 来解析响应,而不是编写它。
因此,解决方案是 对 object 映射器使用相同的 mixin,以实现 序列化和反序列化 。以下定义就足够了:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
static class AbstractTypeMixIn {
}
它只是在JSON中添加了@type
属性用于模棱两可的child 类.
我们使用通过 xcj
从模式生成的 object 类型。 因此,对类型定义的控制不是很灵活。我们还使用 JAXB 注释。
然后,我们使用 Jackson Faster XML 对那些 object 进行反序列化。不幸的是,当我们反序列化抽象 classes 时,我们得到一个异常:
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])
对于摘要 class 的 single child 通过添加 mixin 可以轻松解决上述问题:
@JsonTypeInfo(defaultImpl = ChildType.class, use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
static class AbstractTypeMixIn {
}
并在 object 映射器中注册它:
objectMapper = new ObjectMapper();
objectMapper.addMixIn(AbstractType.class, AbstractTypeMixIn.class);
...
objectMapper.registerModule(new JaxbAnnotationModule());
当单个 class 继承抽象时,这就像一个魅力。多个 children 呢?知道如何为抽象 class 的多个继承者实现它吗?如果不是 mixins,还有什么?
@JsonSubTypes
注释可能对您有用。详见
问题是我只使用 mixin 来解析响应,而不是编写它。 因此,解决方案是 对 object 映射器使用相同的 mixin,以实现 序列化和反序列化 。以下定义就足够了:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
static class AbstractTypeMixIn {
}
它只是在JSON中添加了@type
属性用于模棱两可的child 类.