【问题标题】:scala play json reads for a seal trait or enum type objectscala play json 读取密封特征或枚举类型对象
【发布时间】:2018-10-05 15:26:32
【问题描述】:

我有以下带有密封特征和案例对象的 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

【问题讨论】:

  • 自动读/写宏支持格式良好的密封特征/族。

标签: json scala playframework play-json


【解决方案1】:

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]

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

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2015-05-26
    • 2019-04-04
    • 2012-11-21
    • 1970-01-01
    • 2017-09-08
    • 2021-04-20
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多