json scala playframework-2.1

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.