这个问题与下面两个问题有关。
我们想在 play 2.1 应用程序的模型中使用枚举,所以我们发现了以下问题 How to write Reads[T] and Writes[T] in scala Enumeration (play framework 2.1)
然后提到在 Scala 中使用案例类比 Scala 枚举更好。于是我们发现了下面的问题
Case objects vs Enumerations in Scala
那我们上面建议的case类枚举怎么写json格式呢?即案例类枚举就像
trait Enum[A] {
trait Value { self: A => }
val values: List[A]
}
sealed trait Currency extends Currency.Value
object Currency extends Enum[Currency] {
case object EUR extends Currency
case object GBP extends Currency
val values = List(EUR, GBP)
}
我们是 Play/scala 的新手,尤其是它的功能性 JSON api。我试着写谢谢
最佳答案
其他实现
object EnumFormat {
implicit def jsonReads[A](enum: Enumeration): Reads[A] = new Reads[A] {
def reads(json: JsValue): JsResult[A] = json match {
case JsString(s) => {
try {
JsSuccess(enum.withName(s).asInstanceOf[A])
} catch {
case _: NoSuchElementException =>
JsError(s"Enumeration expected of type: '${enum.getClass}', but it does not contain '$s'")
}
}
case _ => JsError("String value expected")
}
}
implicit def jsonWrites[A]: Writes[A] = new Writes[A] {
def writes(v: A): JsValue = JsString(v.toString)
}
implicit def jsonFormat[A](enum: Enumeration): Format[A] = {
Format(jsonReads(enum), jsonWrites)
}
}
object DeviceStatus extends Enumeration {
val UNKNOWN = DeviceStatusType(0x0)
val REGISTERED = DeviceStatusType(0x1)
val NO_REGISTERED = DeviceStatusType(0x1000)
case class DeviceStatusType(code: Int) extends Val(code) {
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit def valueTo(v: Value): DeviceStatusType = v.asInstanceOf[DeviceStatusType]
}
implicit val jsonFormat: Format[DeviceStatus.DeviceStatusType] = EnumFormat.jsonFormat(DeviceStatus)
}
关于json - Play 2.1(scala) - 如何为 scala 枚举案例类编写 Format[T],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16719352/