使用单参数案例类播放JSON读/写

Pau*_*per 16 json scala playframework

Writes为case类创建了一个

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))
Run Code Online (Sandbox Code Playgroud)

这可以扩展为适用于2,3,4,5,6等参数......但不能用于1.

case class B(a: String)
(JsPath.write[String])(unlift(B.unapply))
Run Code Online (Sandbox Code Playgroud)

编译错误:

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))
                           ^
Run Code Online (Sandbox Code Playgroud)

类似的问题也会发生Reads.

我怎样才能获得ReadsWrites单参数的情况下clases?

Dim*_*tri 13

像特拉维斯说:

  1. 转换现有的Reads:使用map方法
  2. 转换现有的Writes:使用contramap

但是,contramap仅适用于生成JsObject的Writes.您的写入将在运行时失败:

val w = JsPath.write[String].contramap[B](_.a)
scala> w.writes(B("Hello"))
java.lang.RuntimeException: when empty JsPath, expecting JsObject
Run Code Online (Sandbox Code Playgroud)

您可以使用Writes.apply以下方式"从头开始"创建写入:

Writes[B](b => JsString(b.a))
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用Reads.apply创建Reads.