Попробуйте spray-json-shapeless , который может автоматически выводить декодеры для ADT следующим образом:
sealed trait Foo
case class Boo(name: String) extends Foo
case class Buzz(name: String, age: Int) extends Foo
object MyFormats extends DefaultJsonProtocol with FamilyFormats {
implicit val formats = shapeless.cachedImplicit[JsonFormat[Foo]]
}
Не забудьте сделать черту sealed
. Обратите внимание, что необработанный JSON должен содержать type
поле двусмысленность , чтобы rawJsonString.parseJson.convertTo[Foo]
работал, например
object Main extends App {
import MyFormats._
val rawJsonBuzz =
"""
|{
| "name": "Picard",
| "age": 60,
| "type": "Buzz"
|}
""".stripMargin
val buzz = rawJsonBuzz.parseJson.convertTo[Foo]
println(buzz)
val rawJsonBoo =
"""
|{
| "name": "Picard",
| "type": "Boo"
|}
""".stripMargin
val boo = rawJsonBoo.parseJson.convertTo[Foo]
println(boo)
}
должен вывести
Buzz(Picard,60)
Boo(Picard)