【发布时间】:2016-07-01 14:53:03
【问题描述】:
有没有更好的方法来做到这一点?我想避免 Mammal 伴侣对象的读写方法上的模式匹配。
OTOH 我怀疑 shapeless 的可扩展记录在这里会有所帮助,但我不确定如何使用它。谁能告诉我如何使用 shapeless 来完成?
import play.api.libs.json._
object X {
trait Animal {
val category: String
val subcategory: String
}
sealed trait Mammal extends Animal {
override val category = Mammal.name
}
object Man {
implicit val format = Json.format[Man]
val name = "Man"
}
case class Man(weight: Int) extends Mammal {
override val subcategory = Man.name
}
object Whale {
implicit val format = Json.format[Whale]
val name = "Whale"
}
case class Whale(weight: Int) extends Mammal {
override val subcategory = Whale.name
}
object Mammal {
val name = "Mammal"
implicit val format: Format[Mammal] = new Format[Mammal] {
def writes(m: Mammal): JsValue = {
val json = m match {
case x: Man => Json.toJson(x)(Man.format)
case x: Whale => Json.toJson(x)(Whale.format)
}
json.as[JsObject] + ("category" -> JsString(m.category)) + ("subcategory" -> JsString(m.subcategory))
}
def reads(json: JsValue): JsResult[Mammal] = {
(json \ "subcategory").as[String] match {
case Man.name => json.validate[Man]
case Whale.name => json.validate[Whale]
case unknown => JsError(s"Unknown subcategory '$unknown'")
}
}
}
}
}
import X._
val man: Mammal = Man(100)
val whale: Mammal = Whale(1000)
val json = Json.toJson(man)
val read = json.validate[Mammal]
【问题讨论】:
标签: json scala serialization deserialization shapeless