json - Play Json 添加类中不存在的字段

标签 json scala playframework playframework-json

假设我有一个这样的类(class):

abstract class SomeSuperClass(name: String)
case class SomeClass(someString: String, opt: Option[String]) extends SomeSuperClass("someName")

我想序列化此类并能够添加 name 字段,这是我的第一种方法:

implicit def serialize: Writes[SomeClass] = new Writes[SomeClass] {
  override def writes(o: SomeClass): JsValue = Json.obj(
    "someString" -> o.someString,
    "opt" -> o.opt,
    "name" -> o.name
  )
}

如果存在 None,则返回 null,因此我更改了我的实现 following the documentation对此:

implicit def serialize: Writes[SomeClass] = (
  (JsPath \ "someString").write[String] and
  (JsPath \ "opt").writeNullable[String] and
  (JsPath \ "name").write[String]
)(unlift(SomeClass.unapply))

这不会编译,只有当我删除名称字段时它才有效:

[error]   [B](f: B => (String, Option[String], String))(implicit fu: play.api.libs.functional.ContravariantFunctor[play.api.libs.json.OWrites])play.api.libs.json.OWrites[B] <and>
[error]   [B](f: (String, Option[String], String) => B)(implicit fu: play.api.libs.functional.Functor[play.api.libs.json.OWrites])play.api.libs.json.OWrites[B]
[error]  cannot be applied to (api.babylon.bridge.messaging.Command.SomeClass => (String, Option[String]))
[error]       (JsPath \ "opt").writeNullable[String] and

如何添加一个不严格存在于案例类中且具有可选字段的字段?

我使用的是 play-json 2.3.0。

最佳答案

您可以为 JSON 写入编写自己的提取器,该提取器采用 SomeClass 实例并返回 (String, Option[String], String) 元组,即:

implicit def serialize: Writes[SomeClass] = (
  (JsPath \ "someString").write[String] and
  (JsPath \ "opt").writeNullable[String] and
  (JsPath \ "name").write[String]
)(s => (s.someString, s.opt, s.name))

这给你:

Json.toJson(SomeClass("foo", None))
// {"someString":"foo","name":"someName"}

Jspm.toJson(SomeClass("foo", Some("bar")))
// {"someString":"foo","opt":"bar","name":"someName"}

关于json - Play Json 添加类中不存在的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357365/

相关文章:

json - 如何在另一个 JObject 中循环动态 JObject?

scala - Anorm查询中如何使用 'like'?

scala - 共享错误和密封特征的函数

java - LinkedIn - 如何传递查询参数

php - 使用 mysql 数据库中的数据过滤 ListView

c# - 将 JSON 对象反序列化为数组

java - Play Framework 2.7 : How to update session within a Action composition in Java

playframework - 如何访问 Play Guice 模块中的请求?

jquery - 为什么我的 YQL 查询在 jQuery 中返回空结果,而相同的 YQL 查询在 YQL 控制台返回正值?

scala - RDD 映射中的 Spark Scala 序列化错误