Jackson XmlMapper 在将 XML 写入文件时强制使用小写标记名称

Posted

技术标签:

【中文标题】Jackson XmlMapper 在将 XML 写入文件时强制使用小写标记名称【英文标题】:Jackson XmlMapper forces lower case tag names while writing XML to a file 【发布时间】:2020-08-31 13:18:39 【问题描述】:

我在尝试使用 XmlMapper 从 POJO 写入 XML 文件时遇到问题。即使我使用的是 JacksonXmlProperty(localname ="UPPERCASE")

,XmlMapper 也会强制使用小写标签名称

这是我映射的 POJOS 的代码

项目XML:

data class ItemXML(
    @JacksonXmlProperty(localName = "ITEMTYPE") val itemType: String,
    @JacksonXmlProperty(localName = "ITEMID") val itemId: String,
    @JacksonXmlProperty(localName = "QTY") val qty: Int,
    @JacksonXmlProperty(localName = "COLOR") val color: Int,
    @JacksonXmlProperty(localName = "EXTRA") val extra: String,
    @JacksonXmlProperty(localName = "ALTERNATE") val alternate: String,
    @JacksonXmlProperty(localName = "MATCHID") val matchId: Int,
    @JacksonXmlProperty(localName = "COUNTERPART") val counterpart: String
)

InventoryXML

@JacksonXmlRootElement(localName = "INVENTORY")
data class InventoryXML(
    @JacksonXmlProperty(localName = "ITEM")
    @JacksonXmlElementWrapper(useWrapping = false)
    val item: List<ItemXML>
)

以下是将 XML 写入放置在 OnCreate() 方法中的文件的代码:

inventoryXml = xmlMapper.readValue(data, InventoryXML::class.java)

pathFile = filesDir.absolutePath + "/inventory.xml"

xmlMapper.writeValue(File(pathFile), inventoryXml)

这是已保存的文件(如您所见,只有 INVENTORY 标记已保存为大写)

<INVENTORY>
  <item>
    <alternate>N</alternate>
    <color>0</color>
    <counterpart>N</counterpart>
    <extra>N</extra>
    <itemid>old012</itemid>
    <itemtype>M</itemtype>
    <matchid>0</matchid>
    <qty>1</qty>
  </item>
  <item>
    <alternate>N</alternate>
    <color>11</color>
    <counterpart>N</counterpart>
    <extra>N</extra>
    <itemid>3430c02</itemid>
    <itemtype>P</itemtype>
    <matchid>0</matchid>
    <qty>1</qty>
  </item>
</INVENTORY>

这段代码有什么问题?我希望按照 JacksonXmlProperty 的 localName 属性中指定的方式保存标签。

【问题讨论】:

你用的是哪个版本的jackson? 我使用的是 2.10.3 版本,看看下面的 impl: implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.10.3" 你能用最新的 2.11.0 试试吗? 我尝试了最新版本,但没有任何改变.. 【参考方案1】:

重命名属性以遵循标准 Bean 命名约定,即驼峰式,因为这是 Jackson 所期望的:

项目XML:

data class ItemXML(
    @JacksonXmlProperty(localName = "ITEMTYPE") val itemType: String,
    @JacksonXmlProperty(localName = "ITEMID") val itemId: String,
    @JacksonXmlProperty(localName = "QTY") val qty: Int,
    @JacksonXmlProperty(localName = "COLOR") val color: Int,
    @JacksonXmlProperty(localName = "EXTRA") val extra: String,
    @JacksonXmlProperty(localName = "ALTERNATE") val alternate: String,
    @JacksonXmlProperty(localName = "MATCHID") val matchId: Int,
    @JacksonXmlProperty(localName = "COUNTERPART") val counterpart: String
)

InventoryXML

@JacksonXmlRootElement(localName = "INVENTORY")
data class InventoryXML(
    @JacksonXmlProperty(localName = "ITEM")
    @JacksonXmlElementWrapper(useWrapping = false)
    val item: List<ItemXML>
)

【讨论】:

对不起,我粘贴了错误的代码,当然我使用了命名约定,杰克逊在保存标签时仍然使用小写 我想 InventoryXML 中的 List 可能有问题,但我已经尝试了所有方法,但没有任何效果【参考方案2】:

您可以为您的 Jackson XmlMapper 设置一个 PropertyNamingStrategy。所有大写命名都没有预定义的类或常量,但很容易创建自己的:

class UpperCaseStrategy : PropertyNamingStrategyBase() 
    override fun translate(input: String): String =
        input.toUpperCase()


val xmlMapper = XmlMapper().apply 
    setPropertyNamingStrategy(UpperCaseStrategy())

【讨论】:

以上是关于Jackson XmlMapper 在将 XML 写入文件时强制使用小写标记名称的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jackson XmlMapper 将 XML 反序列化为 POJO

在将 json 反序列化为对象时,使用 jackson 将 asp.net / MS 专有 json Dateformat 转换为 java8 LocalDateTime

仅在 XML 中忽略字段,但在 Spring Boot(xml 映射器)中不忽略 json

Rest easy 3 + Jackson + Tomcat + XML 响应

Jackson 学习笔记 XML转JSON

Jackson 学习笔记 XML转JSON