我正在尝试使用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 = true
Jackson会期望例如
<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 = false
Jackson希望使用XML元素而不是XML属性。
参见@JacksonXmlProperty
的Java文档。