You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jackson忽略XML属性将XML转换为指定格式JSON?

解决方案

问题背景

给定XML片段:

<dateIssuedField class="org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl" resolves-to="org.apache.xerces.jaxp.datatype.SerializedXMLGregorianCalendar">
    <lexicalValue>0001-01-01T00:00:00</lexicalValue>
</dateIssuedField>

需要转换为目标JSON:

"dateIssuedField": {"0001-01-01T00:00:00"}

核心需求:忽略XML节点的所有属性,仅保留lexicalValue的内容,且不生成实体类。

解决步骤及代码

你之前的问题在于只配置了JSON反序列化的忽略选项,而XML属性需要单独配置。以下是可行的代码实现:

XmlMapper xmlMapper = new XmlMapper();
// 关键:忽略XML中的所有未知属性
xmlMapper.configure(XmlParser.Feature.IGNORE_UNKNOWN_ATTRIBUTES, true);
// 读取XML为JsonNode结构
JsonNode rootNode = xmlMapper.readTree(xml.getBytes());

// 定位并处理dateIssuedField节点
if (rootNode.has("dateIssuedField")) {
    JsonNode dateNode = rootNode.get("dateIssuedField");
    if (dateNode.has("lexicalValue")) {
        // 创建新节点,将lexicalValue的值作为键(空值占位)
        ObjectNode newDateNode = xmlMapper.createObjectNode();
        newDateNode.put(dateNode.get("lexicalValue").asText(), "");
        // 替换原节点
        ((ObjectNode) rootNode).set("dateIssuedField", newDateNode);
    }
}

// 转换为最终JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
String jsonOutput = objectMapper.writeValueAsString(rootNode);

说明

  1. XmlParser.Feature.IGNORE_UNKNOWN_ATTRIBUTES:这是处理XML属性的专属配置,能直接忽略class、resolves-to这类不存在对应类的属性,避免解析报错。
  2. 手动操作JsonNode:无需实体类或MixIn,直接通过节点API修改结构,把lexicalValue的内容提取出来作为dateIssuedField的子节点内容,完全匹配你的目标格式。
  3. 若XML存在多层嵌套,只需调整节点定位逻辑,找到对应的dateIssuedField节点重复上述处理即可。

内容的提问来源于stack exchange,提问作者djb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:52:56