play-json
, кажется, имеет готовую поддержку для запечатанных черт.Анализ
кажется, способ использовать это следующим образом
sealed trait Family
case class ChildA(status: Boolean) extends Family
case class ChildB(name: String, age: Int) extends Family
implicit val childAFormat = Json.format[ChildA]
implicit val childBFormat = Json.format[ChildB]
implicit val familyFormat = Json.format[Family]
println(
Json.parse(
"""{
| "name": "Bob",
| "age": 10,
| "_type": "controllers.ChildB"
|}""".stripMargin
).as[Family]
)
, который печатаетChildB(Bob,10)
.
play-json-extensions
также, кажется, поддерживает запечатанные черты, такие как
sealed trait Family
case class ChildA(status: Boolean) extends Family
case class ChildB(name: String, age: Int) extends Family
implicit val childBFormat = Jsonx.formatCaseClass[ChildB]
implicit val childAFormat = Jsonx.formatCaseClass[ChildA]
implicit val familyFormat = Jsonx.formatSealed[Family]
println(
Json.parse(
"""{
| "name": "Bob",
| "age": 10
|}""".stripMargin
).as[Family]
)
, который печатает ChildB(Bob,10)
.
Относительнообъекты case я смог заставить его работать только тогда, когда они пустые
sealed trait Family
case object ChildA extends Family
case object ChildB extends Family
, поэтому я не уверен, как именно решить ваш вопрос, однако, надеюсь, этот ответ даст какое-то направление.