scala play json читает для черты печати или типа enum - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий scala-код с запечатанными чертами и объектами case.

sealed trait StudentType {
  val studentLevel: String
  val code: Int
}

case object UnderGradFull extends StudentType {
  val studentLevel = "UGF"
  val code = 11
}
case object UnderGradPart extends StudentType {
  val studentLevel = "UGP"
  val code = 12
}
case object Grad extends StudentType {
  val studentLevel = "GR"
  val code = 22
}
case object OtherStudentType extends StudentType {
  val studentLevel = "OST"
  val code = 20
}

и объектом класса case, который использует StudentType

case class StudentInfo(studentName: String, studentType: StudentType)

object StudentInfo {
  implicit val reads: Reads[StudentInfo] = (
    (JsPath \ "studentName").read[String] and
      (JsPath \ "studentType").read[StudentType]
  )(StudentInfo.apply _)

  implicit val writes: Writes[StudentInfo] = (
    (JsPath \ "studentName").write[String] and
      (JsPath \ "studentType").write[StudentType]
  )(unlift(StudentInfo.unapply))
}

как я могу создать implicit reads/writes для StudentType trait?

1 Ответ

0 голосов
/ 07 октября 2018

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

, поэтому я не уверен, как именно решить ваш вопрос, однако, надеюсь, этот ответ даст какое-то направление.

...