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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:45:04