java - 无法使用 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。现在有更新的方法来做到这一点吗?
解决方案
好吧,没关系,我犯了一个愚蠢的错误。Jackson Dataformat Xml 的 0.6.2 版本一开始就应该让我产生怀疑。似乎在某个时候他们移动到了一个新的命名空间,而我在 gradle 中使用了旧的命名空间,可悲的是,它解析为一个 maven 存储库,该存储库最后一次更新是在 2011 年。更新命名空间使其解析为 2.9.5,它具有 useWrapping 属性。设置这个解决了这个问题。
推荐阅读
- python - 我怎么能用 BeautifulSoup 分割这个?
- react-native - 在 React Native Expo 中更新状态变量
- list - Flutter ListView删除项目不起作用
- python - 使用 for 循环与嵌套 if 语句相结合,基于 Python 中不同 DataFrame 的 3 列创建新的 pandas DataFrame
- android - android.view.InflateException: Binary XML file line #5: Binary XML file line #5: Error inflating class layout
- csv - 错误:LoadError:BoundsError:尝试在运行 Julia 脚本的索引 [430, Base.Slice(Base.OneTo(20))] 处访问 429├ù20 ArrayLogical{2}
- azure - 尝试在 Application Insights 中添加收藏夹时出现错误,“创建 Application Insights 'Events logLevel and message' failed
- javascript - 从 [object Object] 检索数据时出现问题
- powerbi - 基于度量在 Power BI 上显示/隐藏视觉对象
- pdo - PDO 问题。我是 PHP 新手,我的代码可以工作,但某些部分我不明白