覆盖 Play JSON Combinator Writes 的值

Posted

技术标签:

【中文标题】覆盖 Play JSON Combinator Writes 的值【英文标题】:Overwrite value of Play JSON Combinator Writes 【发布时间】:2015-10-25 19:13:12 【问题描述】:

假设我有一个这样写的 json

  implicit val userWrites: Writes[User] = (
    (__ \ "name").write[String] ~
      (__ \ "email").write[String] ~
      (__ \ "encryptedPassword").write[String] ~
      (__ \ "id").writeNullable[Long]
    )(unlift(User.unapply))

如果我不想打印密码,而只是打印一个字符串"hidden",我该如何使用组合器来实现呢?

我正在寻找与此类似的解决方案

  implicit val userWrites: Writes[User] = (
    (__ \ "name").write[String] ~
      (__ \ "email").write[String] ~
      (__ \ "encryptedPassword").write[String](Writes.pure("hidden")) ~
      (__ \ "id").writeNullable[Long]
    )(unlift(User.unapply))

【问题讨论】:

【参考方案1】:

你可以这样做:

implicit val userWrites = new Writes[User] 
  override def writes(user: User): JsValue = Json.obj(
    "name" -> user.name,
    "email" -> user.email,
    "encryptedPassword" -> "hidden",
    "id" -> user.id
  )

【讨论】:

【参考方案2】:

这应该可行:

implicit val userWrites: Writes[User] = (
    (__ \ "name").write[String] ~
      (__ \ "email").write[String] ~
      (__ \ "encryptedPassword").write[String](Writes((_: String) => JsString("hidden"))) ~
      (__ \ "id").writeNullable[Long]
    )(unlift(User.unapply))

【讨论】:

谢谢@Grisuu。这是我一直在寻找的答案。但是,我发现为不同的场景创建不同的类是更好的做法,并且只使用默认的 JSON 读取和 JSON 写入。这比编写一堆 JSON 映射代码要干净得多。

以上是关于覆盖 Play JSON Combinator Writes 的值的主要内容,如果未能解决你的问题,请参考以下文章

延迟Y-Combinator中的抽象评估

markdown 使用Javascript向Y Combinator介绍

[Javascript] Improve Composition with the Compose Combinator

实用函数式编程技巧:Combinator Pattern

[译] The Why of Y - 理解Y Combinator

使用 Play 框架覆盖 HTTP 方法