【问题标题】:Jackson XML Annotations: String element with attributeJackson XML Annotations:具有属性的字符串元素
【发布时间】:2013-11-19 18:09:47
【问题描述】:

我似乎无法找到一种方法来制作 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”周围的元素标签我不想显示。

【问题讨论】:

  • 我很好奇您为什么使用 Jackson 特定的注释而不是 JAXB 注释。 Jackson 主要是一个用于生成 JSON 而不是 XML 的框架,因此缺少 JAXB 的一些特性。

标签: java xml jackson


【解决方案1】:

您应该为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>

【讨论】:

  • 原来我是从错误的依赖项中导入的,并且正在获取不包含该注释的 jackson-dataformat-xml 的旧版本:\
  • 可以理解。与杰克逊一样出色,他们的文档是可怕的。所以很难找到哪些版本在哪里以及哪些注释与这些版本一起可用。
  • 我之前肯定已经翻阅过他们的文档,我知道你的意思,但这绝对是我的 - 他们的依赖在他们的 github 页面上被公然提到:github.com/FasterXML/jackson-dataformat-xml。我正在寻找 gradle 依赖项,但谷歌搜索和粘贴速度太快了。
  • @llya : 在Root 类上我们不需要@JacksonXmlRootElement 吗?
  • 当有人提供您正在寻找的东西时真是太棒了。 +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,它会生成默认构造函数。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      相关资源
      最近更新 更多