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
)
如果您不喜欢自己定义ns
和value
属性的初始值,请使用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:具有属性的字符串元素的主要内容,如果未能解决你的问题,请参考以下文章
sbt 程序集重复数据删除:在以下位置找到不同的文件内容:jackson-annotations
jackson-annotations-2.6.1.jar是啥包,有啥用
Jackson JSON 处理器:SerializationConfig.Feature.USE_ANNOTATIONS 设置为 false