json scala playframework

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:

  1. Transformando una lectura existente: use el método de mapa
  2. 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)