Angenommen, Sie eine JSON haben, die wie folgt aussieht:Jackson: deserialisiert JSON Scala ADT
[{"foo": 1, "bar": 2}, {"foo": 3, "bar": {"baz": 4}}]
Es ist natürlich zu versuchen, scheint dies mit einer Scala Summe Typ darstellen:
sealed trait Item
case class IntItem(foo: Int, bar: Int) extends Item
case class Baz(baz: Int)
case class BazItem(foo: Int, bar: Baz) extends Item
Meine Frage ist: Ist es möglich, Jacksons Scala-Modul zu verwenden, um den obigen JSON in eine List[Item]
zu serialisieren?
Mein Versuch:
val string = "[{\"foo\": 1, \"bar\": 2}, {\"foo\": 3, \"bar\": {\"baz\": 4}}]"
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.readValue[List[Item]](string)
Die Ausnahme:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: konstruieren kann nicht Instanz ... Artikel, Problem : abstrakte Typen müssen entweder zu konkreten Typen gemappt werden, einen benutzerdefinierten Deserializer haben oder mit zusätzlichen Typinformationen um [Source: [{"foo": 1, "bar": {"baz": 2}}, { "foo": 3, "bar": {"baz": 4}}]; Zeile: 1, Spalte: 2] (durch Referenzkette: com.fasterxml.jackson.module.scala.deser.BuilderWrapper [0])
, dass es ziemlich klar, was das Problem macht, ist, aber ich bin Ich bin mir nicht sicher, wie ich es am besten beheben kann.
Ich füge nur hinzu, wenn Sie '" bar ": 2' mit' "bar": {"baz": 2} 'und' List [Element] 'mit' List [BazItem] 'dann alles funktioniert Gut, es ist wirklich ein Problem mit ADT's. –
Ich frage mich nur ... wenn, sagen wir mal, du würdest Jackson implementieren, wie würdest du darüber raten, in welchen Typ jedes der Listenelemente geparst werden soll. – Dima