Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何在scala枚举中写入读取[T]和写入[T](play framework 2.1)_Json_Scala_Playframework 2.1 - Fatal编程技术网

Json 如何在scala枚举中写入读取[T]和写入[T](play framework 2.1)

Json 如何在scala枚举中写入读取[T]和写入[T](play framework 2.1),json,scala,playframework-2.1,Json,Scala,Playframework 2.1,我对PlayFramework2.1中新的ScalaJson特性有点迷茫。 我想在枚举中写入读取和写入 这是我的密码: object EnumA extends Enumeration { type EnumA = Value val VAL1, VAL2, VAL3 = Value def parse(str:String) : EnumA = { str.toUpperCase() match { case "VAL1" => VAL1

我对PlayFramework2.1中新的ScalaJson特性有点迷茫。 我想在枚举中写入读取和写入

这是我的密码:

object EnumA extends Enumeration {
 type EnumA = Value
 val VAL1, VAL2, VAL3 = Value

def parse(str:String) : EnumA = {
    str.toUpperCase() match {
         case "VAL1" => VAL1
         case "VAL2" => VAL2
         case "VAL3" => VAL3
         case _ => null
    }
}}
有什么想法吗


谢谢。

简短回答:使用类似的方法

回答很长,您可以为枚举类型创建可重复使用的读取,而不是在枚举中放置读取:

object EnumA extends Enumeration {
  type EnumA = Value
  val VAL1, VAL2, VAL3 = Value
}

object EnumUtils {
  def enumReads[E <: Enumeration](enum: E): Reads[E#Value] = new Reads[E#Value] {
    def reads(json: JsValue): JsResult[E#Value] = json match {
      case JsString(s) => {
        try {
          JsSuccess(enum.withName(s))
        } catch {
          case _: NoSuchElementException => JsError(s"Enumeration expected of type: '${enum.getClass}', but it does not appear to contain the value: '$s'")
        }
      }
      case _ => JsError("String value expected")
    }
  }
}

(在Scala中使用null被认为是不好的形式。)

将枚举写入JsValues更简单:

object EnumUtils {
  ...
  implicit def enumWrites[E <: Enumeration]: Writes[E#Value] = new Writes[E#Value] {
    def writes(v: E#Value): JsValue = JsString(v.toString)
  }
}
类似地,您可以创建一个函数来创建一个结合读取和写入的Format对象:

object EnumUtils {
  ....
  implicit def enumFormat[E <: Enumeration](enum: E): Format[E#Value] = {
    Format(EnumReader.enumReads(enum), EnumWriter.enumWrites)
  }
}
对象枚举{
....

implicit def enumFormat[E当我在repl中尝试您的代码时,我得到以下错误implicit val myEnumReads:Reads[EnumA#Value]=EnumUtils.enumReads(EnumA)错误:未找到:键入EnumA implicit val myEnumReads:Reads[EnumA#Value]=EnumUtils.enumReads(EnumA)^@smk:OPs上下文在我发布的代码中是隐式的。我已将其更新为现在包含。这是完整的@smk感谢,我修复了一个小错误:
EnumA#Value
EnumA.Value
object EnumUtils {
  ...
  implicit def enumWrites[E <: Enumeration]: Writes[E#Value] = new Writes[E#Value] {
    def writes(v: E#Value): JsValue = JsString(v.toString)
  }
}
import EnumUtils.enumWrites
val myEnumJson: JsValue = Json.toJson(EnumA.VAL1)
object EnumUtils {
  ....
  implicit def enumFormat[E <: Enumeration](enum: E): Format[E#Value] = {
    Format(EnumReader.enumReads(enum), EnumWriter.enumWrites)
  }
}