Jackson XML Annotations:具有属性的字符串元素

Posted

技术标签:

【中文标题】Jackson XML Annotations:具有属性的字符串元素【英文标题】:Jackson XML Annotations: String element with attribute 【发布时间】: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 的一些特性。 【参考方案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

【讨论】:

以上是关于Jackson XML Annotations:具有属性的字符串元素的主要内容,如果未能解决你的问题,请参考以下文章

Jackson Annotations 基本用法

sbt 程序集重复数据删除:在以下位置找到不同的文件内容:jackson-annotations

jackson-annotations-2.6.1.jar是啥包,有啥用

Jackson JSON 处理器:SerializationConfig.Feature.USE_ANNOTATIONS 设置为 false

Jackson使用手册

JAXB实现java对象与xml之间转换