使用Jackson对PMD输出进行反序列化



我正在尝试使用Jackson对PMD的输出进行反序列化。具体来说,我想获得一个违规列表及其数据,PMD以以下形式提供给我:

<pmd-cpd>
<duplication lines="615" tokens="1188">
<file line="126" path="SomePathHere"/>
<file line="126" path="SomePathHere"/>
<codefragment>
<![CDATA[
SomeCodeFragmentHere
]]>
</codefragment>
</duplication>
MoreDuplications
</pmd-cpd>

我目前有以下类要反序列化成:

public class PmdResults {
@JacksonXmlProperty(localName = "duplication")
List<CodeClone> codeClones;
}
public class CodeClone {
public int lines;
public int tokens;
@JacksonXmlProperty(localName = "file")
public List<SourceFile> files;
public CodeClone() { super(); }

public static class SourceFile {
public int line;
public String path;
}
}

目前,Jackson能够反序列化根和两个"行"。和";tokens"正确。然而,与其试图反序列化这两个文件,不如元素放到SourceFile对象中,它直接查找"line"属性来反序列化这些元素的属性。我也不确定如何让Jackson忽略"代码片段"。元素,因为我实际上并不需要这些信息。我将非常感谢在这方面的任何帮助,因为我有点难以理解为什么它能够识别复制元素应该成为列表中的对象,而不是似乎遵循相同格式的文件元素。

p。:我实际上更愿意完全摆脱PmdResults类,并直接反序列化一个列表,但我一直无法找到任何方法来做到这一点。

您的Java代码中有两种问题:


在您的Java代码中,您有类型为List<...>的属性

@JacksonXmlProperty(localName = "duplication")
List<CodeClone> codeClones;

@JacksonXmlProperty(localName = "file")
List<SourceFiles> files;

您需要注释这些List属性还有@JacksonXmlWrapper(useWrapping = false)。如果省略这一点,则默认为useWrapping = trueJackson会期望例如

<file>  
<file>...</file>
<file>...</file>
</file>

而不是

<file>...</file>
<file>...</file>

参见@JacksonXmlElementWrapper的Java文档。


在XML示例中,您有几个XML属性(如line="126"path="SomePathHere")哪些当然不同XML元素(如<line>126</line><path>SomePathHere</path>)。

您需要通过注释告诉Jackson这些是XML属性使用@JacksonXmlProperty(isAttribute = true)设置Java属性。如果省略它,则默认为isAttribute = falseJackson希望使用XML元素而不是XML属性。

参见@JacksonXmlProperty的Java文档。

最新更新