Play Framework 2.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 } }}
任何想法 ?
谢谢。
简短答案:使用类似Play Enumeration Utils的工具。
长答案,而不是将“读取” 放入 您的枚举,您可以为“枚举”类型创建可重复使用的读取:
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") } } }
然后,当您想将某些内容解析为枚举时,请为作用域中的特定Enum类型创建一个隐式的Reads:
import some.thing.EnumUtils implicit val myEnumReads: Reads[EnumA.Value] = EnumUtils.enumReads(EnumA) val myValue: EnumA.Value = someJsonObject.as[EnumA.Value]
要么
val myValue: EnumA.Value = someJsonObject.asOpt[EnumA.Value].getOrElse(sys.error("Oh noes! Invalid value!"))
(在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) } }
然后,在尝试编写枚举(或将其显式传递给toJson函数之前),将其导入作用域:
toJson
import EnumUtils.enumWrites val myEnumJson: JsValue = Json.toJson(EnumA.VAL1)
您可以类似地使函数创建一个结合读取和写入的Format对象:
object EnumUtils { .... implicit def enumFormat[E <: Enumeration](enum: E): Format[E#Value] = { Format(EnumReader.enumReads(enum), EnumWriter.enumWrites) } }