【问题标题】:Deserializing PMD output with Jackson使用 Jackson 反序列化 PMD 输出
【发布时间】:2021-12-11 12:39:57
【问题描述】:

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

<pmd-cpd>
<duplication lines="615" tokens="1188">
<file line="126" path="Some\Path\Here"/>
<file line="126" path="Some\Path\Here"/>
<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 能够正确反序列化根以及“行”和“令牌”。然而,与其尝试将两个“file”元素反序列化为 SourceFile 对象,它直接查找“line”属性来反序列化这些元素的属性。我也不确定如何让杰克逊忽略“代码片段”元素,因为我实际上并不需要这些信息。我将非常感谢这方面的任何帮助,因为我有点难以理解为什么它能够识别出重复元素应该成为列表中的对象,而不是似乎遵循的文件元素相同的格式。

PS.:我实际上更愿意完全摆脱 PmdResults 类,并直接反序列化 List,但我也找不到任何方法。

【问题讨论】:

    标签: java xml jackson pmd


    【解决方案1】:

    你的 Java 代码有两种问题:


    在您的 Java 代码中,您有 List&lt;...&gt; 类型的属性

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

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

    您需要注释这些List 属性 还有@JacksonXmlWrapper(useWrapping = false)。 如果您省略它,则默认值为useWrapping = true 例如,杰克逊会期望

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

    而不仅仅是

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

    另请参阅Java doc of @JacksonXmlElementWrapper


    在您的 XML 示例中,您有几个 XML 属性 (如line="126"path="Some\Path\Here") 这当然不同于 XML 元素(如 &lt;line&gt;126&lt;/line&gt;&lt;path&gt;Some\Path\Here&lt;/path&gt;)。

    您需要通过注释告诉杰克逊这些是 XML 属性 带有@JacksonXmlProperty(isAttribute = true) 的Java 属性。 如果你省略这个,那么默认是isAttribute = false Jackson 会期望 XML 元素而不是 XML 属性。

    另请参阅Java doc of @JacksonXmlProperty

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2020-08-15
      • 1970-01-01
      • 2015-05-20
      • 2020-08-07
      相关资源
      最近更新 更多