当我尝试解析以下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。现在有更新的方法吗?
答案 0 :(得分:0)
好吧,没关系,我犯了一个愚蠢的错误。首先,Jackson Dataformat Xml的0.6.2版本应该使我感到怀疑。似乎在某个时候他们移到了一个新的命名空间,而我在gradle中使用了旧的命名空间,可悲的是,它解析为一个maven仓库,该仓库最后一次更新是在2011年。 更新名称空间使其解析为具有useWrapping属性的2.9.5。设置此设置即可解决问题。