无法使用杰克逊解析XML中的元素列表

时间:2018-08-25 17:55:10

标签: java xml jackson

当我尝试解析以下XML时,Jackson出现错误:

<root>
  <aCollection>
    <language xml:lang="en">
      <entry id="1" value="foo"/>
      <entry id="2" value="bar"/>
      <entry id="3" value="blah"/>
    </language>
  </aCollection>
</root>

我使用的类是:

@Data
@JacksonXmlRootElement(localName = "root")
public class RootDTO {
  @JacksonXmlProperty(localName = "aCollection")
  private CollectionDTO collection;
}

@Data
public class CollectionDTO {
  @JacksonXmlProperty(localName = "language")
  LanguageDTO language;
}

@Data
public class LanguageDTO {
  @JacksonXmlProperty(localName = "entry")
  EntryDTO[] entries;
}

@Data
public class EntryDTO {

  @JacksonXmlProperty(isAttribute = true)
  private String id;

  @JacksonXmlProperty(isAttribute = true)
  private String value;

}

错误是: Can not instantiate value of type [simple type, class com.tinkerdesk.viewer.model.DTO.EntryDTO] from JSON String; no single-String constructor/factory method

如果删除数组括号,它可以工作,但是当然只能解析第一个entry元素。我发现我应该在@JacksonXmlElementWrapper(useWrapping = false)上使用EntryDTO[] entries;,因为元素没有包装。但是,这对我来说不是很麻烦,因为useWrapping中没有com.fasterxml.jackson.xml.annotate.JacksonXmlElementWrapper。我的杰克逊核心版本是2.9.6和xml-databind 0.6.2。现在有更新的方法吗?

1 个答案:

答案 0 :(得分:0)

好吧,没关系,我犯了一个愚蠢的错误。首先,Jackson Dataformat Xml的0.6.2版本应该使我感到怀疑。似乎在某个时候他们移到了一个新的命名空间,而我在gradle中使用了旧的命名空间,可悲的是,它解析为一个maven仓库,该仓库最后一次更新是在2011年。 更新名称空间使其解析为具有useWrapping属性的2.9.5。设置此设置即可解决问题。