这会为案例类创建一个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:使用映射方法
- 转换现有写入:使用 contramap
但是,contramap 仅适用于生成 JsObject 的写入。您的写入将在运行时失败:
val w = JsPath.write[String].contramap[B](_.a)
scala> w.writes(B("Hello"))
java.lang.RuntimeException: when empty JsPath, expecting JsObject
您可以使用Writes.apply
“从头开始”创建写入。 :
Writes[B](b => JsString(b.a))
类似地,您可以使用 Reads.apply 创建 Reads。
关于json - 使用单参数案例类进行 JSON 读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27477269/