json - Cómo escribir Lecturas[T] y Escrituras[T] en enumeración scala(marco de juego 2.1)
playframework-2.1 (1)
Respuesta corta: usa algo como Play Enumeration Utils .
Respuesta larga: en lugar de incluir una Lectura en su enumeración, puede crear una Lectura reutilizable para los tipos de Enumeración:
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")
}
}
}
Luego, cuando desee analizar algo en una enumeración, cree una Lectura implícita para su tipo de Enum específico en el alcance:
import some.thing.EnumUtils
implicit val myEnumReads: Reads[EnumA.Value] = EnumUtils.enumReads(EnumA)
val myValue: EnumA.Value = someJsonObject.as[EnumA.Value]
o
val myValue: EnumA.Value = someJsonObject.asOpt[EnumA.Value].getOrElse(sys.error("Oh noes! Invalid value!"))
(Se considera una mala forma de usar nulo en Scala).
Escribir enums como JsValues es más simple:
object EnumUtils {
...
implicit def enumWrites[E <: Enumeration]: Writes[E#Value] = new Writes[E#Value] {
def writes(v: E#Value): JsValue = JsString(v.toString)
}
}
Luego simplemente importe eso en el alcance antes de intentar escribir una enumeración (o toJson
explícitamente a la función toJson
:
import EnumUtils.enumWrites
val myEnumJson: JsValue = Json.toJson(EnumA.VAL1)
De manera similar, puede crear una función para crear un objeto de Formato combinando Lecturas y Escrituras:
object EnumUtils {
....
implicit def enumFormat[E <: Enumeration](enum: E): Format[E#Value] = {
Format(EnumReader.enumReads(enum), EnumWriter.enumWrites)
}
}
Estoy un poco perdido con la nueva función ScalaJson en Play Framework 2.1. Me gustaría escribir Lecturas y Escrituras en mi Enumeración.
Aquí está mi código:
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
}
}}
Alguna idea ?
Gracias.