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您可以为您的 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