【问题标题】:Play Json add field which is not present in class播放类中不存在的 Json 添加字段
【发布时间】:2014-10-14 09:35:10
【问题描述】:

假设我有这样的课程:

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 scala playframework playframework-json


    【解决方案1】:

    您可以为 JSON 写入编写自己的提取器,而不是使用默认(编译器生成)的 unapply 方法,该方法采用 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"}
    

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多