如何使用Jackson库在XML转JsonNode时忽略属性?
使用Jackson忽略XML属性并完成XML↔JsonNode转换
Jackson完全支持忽略XML属性,你可以通过配置XmlMapper的特性实现,同时需要修正当前转换流程里的错误(比如用ObjectMapper转XML是不对的,XML相关操作要始终用XmlMapper)。
1. 核心配置:让XmlMapper忽略XML属性
通过调整XmlMapper的解析特性,让它在解析XML时只保留元素的文本内容,不把属性映射到JSON结构中:
XmlMapper xmlMapper = XmlMapper.builder() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) // 关键:禁用属性映射,直接保留元素文本作为节点值 .defaultUseWrapper(false) .build();
2. 修正XML→JsonNode的转换流程
你之前绕了Map转JSON再转JsonNode的弯路,可以直接用配置好的XmlMapper把XML解析成JsonNode,效率更高且不会生成多余节点:
// 直接将XML解析为JsonNode,自动忽略所有XML属性 JsonNode jsonNode = xmlMapper.readTree(inputXMLString);
此时jsonNode里的Child1值就是"123456",不会包含Qualifier属性和空键的子节点。
3. 修正JsonNode→XML的转换流程
注意:ObjectMapper是处理JSON的工具,转XML必须用XmlMapper,否则会生成错误的XML结构:
// 用XmlMapper将处理后的JsonNode转回XML String outputXMLString = xmlMapper.writeValueAsString(jsonNode);
完整可运行示例
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.databind.DeserializationFeature; public class XmlJsonConverter { public static void main(String[] args) throws Exception { String inputXMLString = "<Roottag xmlns:ns5=\"http://abc.def.com/foo/bar/default.aspx\">\n" + " <ns5:Parent>\n" + " <ns5:Child1 Qualifier=\"XY\">123456</ns5:Child1>\n" + " <ns5:Child2>160</ns5:Child2>\n" + " </ns5:Parent>\n" + "</Roottag>"; // 配置XmlMapper忽略XML属性 XmlMapper xmlMapper = XmlMapper.builder() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .defaultUseWrapper(false) .build(); // XML转JsonNode JsonNode jsonNode = xmlMapper.readTree(inputXMLString); // 这里可以对JsonNode进行自定义处理 // JsonNode转XML String outputXMLString = xmlMapper.writeValueAsString(jsonNode); System.out.println(outputXMLString); } }
运行后输出的XML完全符合你的期望:
<Parent> <Child1>123456</Child1> <Child2>160</Child2> </Parent>
额外说明
- 如果需要选择性忽略特定属性(而非全部),可以使用Jackson的
@JsonIgnoreProperties注解,但因为你是用JsonNode而非实体类,全局配置忽略所有属性更适配当前场景。 - 若需要保留XML命名空间,可在
XmlMapper中添加命名空间相关配置,示例中因为最终输出不需要命名空间,所以当前配置足够。
内容的提问来源于stack exchange,提问作者CtrlAltElite
相关产品推荐
相关产品推荐

