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

Jackson XML反序列化,多态映射

公沈浪
2023-03-14

我想反序列化以下XML(缩短示例):

<annots>
            <highlight subject="Highlight" page="0">               
                <contents>askdhaskjdhaskjhsakjhdakjshd</contents>
            </highlight>
            <text subject="Comment" page="0" title="Guest" color="#FFFF00">
                <contents>Memo</contents>   
            </text>

</annots>

到目前为止,我想出的代码:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "subject")
@JsonSubTypes({
        @JsonSubTypes.Type(name = "Highlight", value = Highlight.class),
        @JsonSubTypes.Type(name = "Comment", value = Text.class)
})

public abstract class Annotation {

    @JacksonXmlProperty(localName = "subject")
    public String subject;

    @JacksonXmlProperty(isAttribute = true,localName = "page")
    public String page;

    @JacksonXmlProperty(isAttribute = true,localName = "rect")
    public String rect;

    @JacksonXmlProperty(isAttribute = true,localName = "flags")
    public String flags;

    @JacksonXmlProperty(isAttribute = true,localName = "name")
    public String name;

    @JacksonXmlProperty(isAttribute = true,localName = "title")
    public String title;

    @JacksonXmlProperty(isAttribute = true,localName = "color")
    public String color;

    @JacksonXmlProperty(isAttribute = true,localName = "opacity")
    public String opacity;

    @JacksonXmlProperty(localName = "contents")
    public String contents;

}

但这种方法存在几个问题:

>

@JacksonXmlProperty t(localName="subject")始终为空,因为我将其用于类型信息。为什么?,或者如何绕过它?

还是这种方法已经错了?

最后是我使用的周围类:

@JacksonXmlElementWrapper(localName = "annots")
@JacksonXmlProperty(localName = "annots")

public List<Annotation> annots;

共有1个答案

黄信厚
2023-03-14

我能够使用正确的注释子类型HighlightText以及可见的主题来解析此xml。我必须指定此属性应该是可见的:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "subject",
        visible = true)

此外,我正在使用jackson 2.8.8和woodstox 5.0.3进行xml解析。

上面提到了第2点。关于第1点,我认为这完全不能用@JsonTypeInfo实现,因为它的整体思想是在生成的xml文档中显式地添加类型信息。你也许可以用JsonTypeResolver解决一些问题。

 类似资料:
  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它

  • 我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c

  • 我有一个接口,其中和实现。服务器会返回这样的响应- 相应的类来建模它是 中的声明它是哪种车辆。我需要反序列化的成一个对象取决于。如果是,我需要在反序列化和期间使用反序列化。 如何使用gson实现这一点? 编辑-这篇文章的不同之处在于类类型()包含在需要反序列化的中。这里不是。如果在内,我可以为编写自定义反序列化程序,检查,并进行相应的反序列化。但是我想我需要为编写一个自定义反序列化程序,在这里我创

  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)

  • 我对Jackson有一个错误的理解,就是将json文件反序列化为poco。这是我的代码: 我的POCO命名为AnimalBean: }还有我的JSON文件: } 当我执行我的代码时,我有以下错误:未识别的字段“动物园”(类动画豆),未标记为可忽略的。我知道问题是我的json文件开始不直接由动物,但我不能改变它,因为它不是我的。我已经尝试把对象apper.configure(Deseriazatio

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器