IT序号网

xml之Jackson XML 无法反序列化列表

wuhuacong 2025年05月04日 编程语言 89 0

我尝试像这样解析 XML:

fun main() { 
val kotlinXmlMapper = XmlMapper(JacksonXmlModule().apply { 
    setDefaultUseWrapper(false) 
}).registerKotlinModule() 
        .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) 
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
 
val value: Feed = kotlinXmlMapper.readValue(""" 
    <feed xmlns="http://www.w3.org/2005/Atom"> 
      <entry> 
        <id>Test-1</id> 
        <title>Test</title> 
        <summary type="html">Test</summary> 
      </entry> 
      <entry> 
        <id>Test-2</id> 
        <title>Test2</title> 
        <summary type="html">Test2</summary> 
      </entry> 
    </feed> 
""".trimIndent(), Feed::class.java) 
println(value)} 

我的数据类如下所示:

@JacksonXmlRootElement(localName="feed") 
data class Feed( 
        @JacksonXmlElementWrapper(localName="entry") 
        @JsonProperty("entry") 
        val entry: List<Entry>) 
 
@JacksonXmlRootElement(localName="entry") 
data class Entry(val id: String, val title: String, val summary: String) 

我想我用JacksonXmlElementWrapper注释列表元素,然后它应该可以工作。但不幸的是没有:

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `service.Entry` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('Test-1') 
 at [Source: (StringReader); line: 3, column: 15] (through reference chain: service.Feed["entry"]->java.util.ArrayList[0]) 

有人有想法/建议吗?

提前致谢。

请您参考如下方法:

XML 中,默认情况下列表项由额外的节点包装。该节点不代表 POJO 模型中的额外类,因此,我们可以跳过它。您需要在 POJO 模型中仅表示 item 节点,并向 Jackson 指定您希望将有效负载读取为这些节点的列表:

val genres = kotlinXmlMapper.readValue<List<Entry>>(json) 

另请参阅:


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!