【问题标题】:Cannot parse list of elements from xml with Jackson无法使用 Jackson 解析 xml 中的元素列表
【发布时间】:2019-01-31 20:14:59
【问题描述】:

当我尝试解析以下 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 元素。我发现我应该在EntryDTO[] entries; 之上使用@JacksonXmlElementWrapper(useWrapping = false),因为元素没有被包装。然而,这对我来说并不适用,因为com.fasterxml.jackson.xml.annotate.JacksonXmlElementWrapper 中没有useWrapping。我的 Jackson 核心版本是 2.9.6 和 xml-databind 0.6.2。现在有更新的方法吗?

【问题讨论】:

  • 嗨 - 如果您将构造函数添加到设置值的 DTO 类会发生什么 - 我记得这是为 json 输入解决它,不确定 xml 是否相同
  • @RichAckroyd 没有工作使用两个字符串(id/值)的构造函数被忽略。如果我使用单个字符串构造函数并在其中放置一个断点,我可以看到它为我提供了 value 属性的内容,但 Jackson 然后进一步崩溃。

标签: java xml jackson


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2013-09-17
    • 2021-09-19
    • 2020-12-11
    • 2014-12-24
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多