home wiki.fukuchiharuki.me
Menu

キーワード

  • Jackson
  • XML
  • Kotlin
  • data class

現象

Jacksonで次のようなXML上のコレクションをKotlinのデータクラスにデシリアライズできない。

<example>
  <elements>
    <element>...</element>
  </elements>
</example>

次のエラーメッセージを得る。

could not find creator property with name ...

原因

データクラスを次のようには定義できない。

@JacksonXmlRootElement(localName = "example")
data class Example(
  @field: JacksonXmlElementWrapper(localName = "elements")
  @field: JacksonXmlProperty(localName = "element")
  val elements: List<Element> = emptyList()
)

対策

コンストラクタ引数で該当のプロパティ(コレクション)の分を定義しない。

@JacksonXmlRootElement(localName = "example")
data class Example(
  private var elements: List<Element> = emptyList()
) {
  @get: JacksonXmlElementWrapper(localName = "elements")
  @get: JacksonXmlProperty(localName = "element")
  var elements
    set(value) { _elements = value }
    get() = _elements
}

備考

  • コレクションでないプロパティはこのようにする必要はない

参考