Juega JSON Reads/Writes con clases de caso de un solo parámetro
scala playframework (2)
Esto crea una Writes
para una clase de caso
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class A(a: String, b: String, c: String)
(JsPath.write[String] and
JsPath.write[String] and
JsPath.write[String])(unlift(A.unapply))
Esto puede extenderse para trabajar con 2, 3, 4, 5, 6, etc. parámetros ... pero no 1.
case class B(a: String)
(JsPath.write[String])(unlift(B.unapply))
Error del compilador:
error: overloaded method value write with alternatives:
(t: String)(implicit w: play.api.libs.json.Writes[String])play.api.libs.json.OWrites[play.api.libs.json.JsValue] <and>
(implicit w: play.api.libs.json.Writes[String])play.api.libs.json.OWrites[String]
cannot be applied to (B => String)
(JsPath.write[String])(unlift(B.unapply))
^
Un problema similar ocurre con las Reads
.
¿Cómo puedo obtener Reads
y Writes
para clases de caso de un solo parámetro?
Como dijo Travis:
- Transformando una lectura existente: use el método de mapa
- Transformando un escrito existente: use contramap
Sin embargo, contramap solo funciona en Escrituras que producen JsObject. Tus escrituras fallarán en tiempo de ejecución:
val w = JsPath.write[String].contramap[B](_.a)
scala> w.writes(B("Hello"))
java.lang.RuntimeException: when empty JsPath, expecting JsObject
Puede crear una Escritura "desde cero" utilizando Writes.apply
:
Writes[B](b => JsString(b.a))
Del mismo modo, puede crear una Lectura utilizando Reads.apply.
lecturas implícitas de val: Lee [A] = (JsPath / "ax"). lea [B] .map (A.apply)