如何用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);
说明
XmlParser.Feature.IGNORE_UNKNOWN_ATTRIBUTES:这是处理XML属性的专属配置,能直接忽略class、resolves-to这类不存在对应类的属性,避免解析报错。- 手动操作
JsonNode:无需实体类或MixIn,直接通过节点API修改结构,把lexicalValue的内容提取出来作为dateIssuedField的子节点内容,完全匹配你的目标格式。 - 若XML存在多层嵌套,只需调整节点定位逻辑,找到对应的
dateIssuedField节点重复上述处理即可。
内容的提问来源于stack exchange,提问作者djb
相关产品推荐
相关产品推荐

