Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala play json读取seal trait或enum类型的对象_Json_Scala_Playframework_Play Json - Fatal编程技术网

scala play json读取seal trait或enum类型的对象

scala play json读取seal trait或enum类型的对象,json,scala,playframework,play-json,Json,Scala,Playframework,Play Json,我有以下带有密封特征和case对象的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 stud

我有以下带有密封特征和case对象的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
创建
隐式读/写

播放json
似乎对密封的trait有现成的支持。分析

它的使用方法似乎如下

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(鲍勃,10)

似乎也支持这样的封闭特征

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(鲍勃,10)

关于case对象,我只能在它们为空时使其工作

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]

因此,我不确定如何准确地解决您的问题,但希望这个答案能提供一些指导。

用于自动读/写的宏支持格式良好的密封trait/family。