首页 > 解决方案 > 无法使用 Jackson 解析来自 xml 的元素列表

问题描述

当我尝试解析以下 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. 我的 Jackson 核心版本是 2.9.6 和 xml-databind 0.6.2。现在有更新的方法来做到这一点吗?

标签: javaxmljackson

解决方案


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


推荐阅读