簡體   English   中英

scala play json 讀取密封特征或枚舉類型對象

[英]scala play json reads for a seal trait or enum type object

我有以下帶有密封特征和案例對象的 Scala 代碼。

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
}

和使用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))
}

如何為StudentType trait創建implicit reads/writes

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)

關於案例對象,我只能在它們為空時才能使其工作

sealed trait Family
case object ChildA extends Family
case object ChildB extends Family

implicit val childAFormat = Json.format[ChildA.type]
implicit val childBFormat = Json.format[ChildB.type]
implicit val familyFormat = Json.format[Family]

所以我不確定如何准確地解決您的問題,但希望這個答案能提供一些指導。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM