json - 使用单参数案例类进行 JSON 读/写

标签 json scala playframework

这会为案例类创建一个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))
                           ^

读取也会出现类似的问题。

如何获取单参数案例类的读取写入

最佳答案

就像特拉维斯所说:

  1. 转换现有 Reads:使用映射方法
  2. 转换现有写入:使用 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/

相关文章:

scala - Scala 中 Play Framework 2 的日志记录语法

scala - 如何从nexus下载sbt插件?

java - ModelMapper 中的 ClassCastException : EnhancerByModelMapper cannot be cast

javascript - 响应 200 OK 但 Jquery 显示错误?

c# - 解析带有 Html 内容的 Json 字符串

Scala:为什么一个方法不能有多个可变参数?

mongodb - java.lang.NoSuchFieldException : handle Embedded MongoDB with play framework 异常

forms - 玩2形式限制

javascript - 当您不知道数组有多大时,如何获取 JSON 数组中的最后一个索引?

python - 在 Postgres 中更新 json 字段