使用Jackson反序列化PMD CPD XML输出的映射及忽略字段问题
问题原因与解决方案
1. 修复<file>列表反序列化异常
Jackson XML处理列表字段时,默认会假设列表元素外层有一个包装标签(比如<files>包裹所有<file>标签),你的XML结构中没有这层包装,所以需要显式关闭包装逻辑。另外所有作为XML节点属性的字段,建议显式指定isAttribute = true避免解析异常。
要忽略codefragment等不需要的节点,在类上添加@JsonIgnoreProperties(ignoreUnknown = true)即可。
修正后的实体类代码如下:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import java.util.List; // 自动忽略所有未在类中定义的XML标签,包含codefragment @JsonIgnoreProperties(ignoreUnknown = true) public class CodeClone { // 标注是XML节点的属性,而非子节点 @JacksonXmlProperty(isAttribute = true) public int lines; @JacksonXmlProperty(isAttribute = true) public int tokens; // 关闭列表外层包装,直接读取所有<file>子节点 @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "file") public List<SourceFile> files; public static class SourceFile { @JacksonXmlProperty(isAttribute = true) public int line; @JacksonXmlProperty(isAttribute = true) public String path; } } public class PmdResults { @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "duplication") public List<CodeClone> codeClones; }
2. 直接获取List<CodeClone>无需PmdResults包装类
可以先把XML解析为节点树,提取所有<duplication>节点后逐个反序列化,实现代码如下:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.util.ArrayList; import java.util.List; // 你的PMD XML内容 String pmdXml = "xxx"; XmlMapper xmlMapper = new XmlMapper(); // 全局配置也可以实现忽略未知节点,不需要的话可以去掉这行 // xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode root = xmlMapper.readTree(pmdXml); JsonNode duplicationNodes = root.get("duplication"); List<CodeClone> codeClones = new ArrayList<>(); if (duplicationNodes.isArray()) { for (JsonNode node : duplicationNodes) { codeClones.add(xmlMapper.treeToValue(node, CodeClone.class)); } }
内容的提问来源于stack exchange,提问作者Fledgling Pidgeon
相关产品推荐
相关产品推荐

