简短答案:使用类似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.EnumUtilsimplicit 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函数之前),将其导入作用域:
import EnumUtils.enumWritesval 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) }}

![如何在Scala枚举中编写Reads [T]和Writes [T](播放框架2.1) 如何在Scala枚举中编写Reads [T]和Writes [T](播放框架2.1)](http://www.mshxw.com/aiimages/31/437172.png)
