3

这个问题与以下两个问题有关。

我们想在 play 2.1 应用程序的模型中使用枚举,所以我们发现了以下问题 How to write Reads[T] and Writes[T] in scala Enumeration (play framework 2.1)

然后提到在scala中使用case类比使用scala枚举要好。于是我们发现了下面的问题

Scala中的案例对象与枚举

那么我们如何为上面建议的案例类枚举编写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。我试着写谢谢

4

1 回答 1

-1

其他实现

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)
}
于 2016-04-22T05:11:32.980 回答