这会为案例类创建一个Writes

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))


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

case class B(a: String)
(JsPath.write[String])(unlift(B.unapply))


编译器错误:

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))
                           ^


Reads也会发生类似的问题。

如何获得单参数案例分类的ReadsWrites

最佳答案

就像特拉维斯所说:


转换现有的Reads:使用map方法
转换现有的Writes:使用对照图


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

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


您可以使用Writes.apply“从头开始”创建Writes:

Writes[B](b => JsString(b.a))


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

关于json - 使用单参数案例类 Play JSON读/写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27477269/

10-09 02:54