Jackson XML Annotations:带有属性的String元素

时间:2013-11-07 21:31:30

标签: java xml jackson

我似乎无法找到制作Pojo的方法使用将生成xml的jackson-xml注释,如下所示:

<Root>
    <Element1 ns="xxx">
        <Element2 ns="yyy">A String</Element2>
    </Element1>
</Root>

我似乎最接近的是:

根POJO

public class Root {
    @JacksonXmlProperty(localName = "Element1")
    private Element1 element1;

    public String getElement1() {
        return element1;
    }

    public void setElement1(String element1) {
        this.element1 = element1;
    }
}

Element1 POJO

public class Element1 {
    @JacksonXmlProperty(isAttribute = true)
    private String ns = "xxx";
    @JacksonXmlProperty(localName = "Element2")
    private Element2 element2;

    public String getElement2() {
        return element2;
    }

    public void setElement2(String element2) {
        this.element2 = element2;
    }
}

Element2 POJO

public class Element2 {
    @JacksonXmlProperty(isAttribute = true)
    private String ns = "yyy";
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

但这会返回以下内容:

<Root>
    <Element1 ns="xxx">
        <Element2 ns="yyy"><value>A String</value></Element2>
    </Element1>
</Root>

“A String”周围的元素标签我不想显示。

3 个答案:

答案 0 :(得分:28)

您应该对value字段使用JacksonXmlText注释。

public class Element2 
{
    @JacksonXmlProperty(isAttribute = true)
    private String ns = "yyy";
    @JacksonXmlText
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}  

然后XML将看起来像

<Root>
    <Element1 ns="xxx">
        <Element2 ns="yyy">A String</Element2>
    </Element1>
</Root>

答案 1 :(得分:2)

对于 Kotlin,您需要使用 @field annotation 使用站点目标:

data class Element2(
        @field:JacksonXmlProperty(isAttribute = true)
        val ns: String = "yyy",
        @field:JacksonXmlText
        val value: String? = null
)

如果您不喜欢自己为 nsvalue 属性定义初始值,请使用 Kotlin no-args plugin,它会生成默认构造函数。

答案 2 :(得分:0)

很遗憾,我无法发表评论,但我确实想记录一下 flyingAssistant's answer,以防其他人遇到我遇到的相同问题。您不能将 @JacksonXmlText 添加到构造函数属性。根据 GitHub 存储库中报告的此 issue,此功能可能会在构建 2.13 中添加。 所以现在你必须这样做

data class Element2(@field:JacksonXmlProperty(isAttribute = true) val ns: String = "yyy") {
    @field:JacksonXmlText
    val value: String? = null
}