json - Play 2.1(scala) - 如何为 scala 枚举案例类编写 Format[

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

我们想在 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/

相关文章:

jsp - JSTL 自定义标签变量替换

arrays - 重命名 MongoDB 数组中嵌入文档中的字段不起作用

c# - 在 C#/.NET 中逐笔更新到烛台/OHLC 数据

three.js - 在 three.js 中显示数千张图片

node.js - Mongo降序排序

image - 通过 mongo shell 脚本将图像文件读入 MongoDB 文档的二进制字段

python - 在python多处理中实现Ctrl+C取消

visual-studio-2012 - Visual Studio : Undo-redo of

vbscript - 带参数的 Shell.Run

python - 在 python 中加载 JSON 作为实际对象,而不是 dict