【问题标题】:Jackson XML Unable to deserialize listJackson XML 无法反序列化列表
【发布时间】:2020-07-04 11:42:00
【问题描述】:

我尝试像这样解析 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])

有人有什么想法/建议吗?

提前致谢。

【问题讨论】:

  • 尝试在没有Feed 类的情况下解析它。就像一个列表:List&lt;Entry&gt;。看看这个Java 示例:Parsing XML to Java Object Node
  • @MichałZiober 太棒了!现在它起作用了!您能否添加一个答案并解释为什么它现在可以工作?那我就可以接受答案了

标签: xml kotlin jackson jackson-dataformat-xml


【解决方案1】:

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

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

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 2018-08-15
    • 2020-05-27
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多