【发布时间】: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 然后进一步崩溃。