Json 如何在scala枚举中写入读取[T]和写入[T](play framework 2.1)
我对PlayFramework2.1中新的ScalaJson特性有点迷茫。 我想在枚举中写入读取和写入 这是我的密码: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
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)
}
}