覆盖播放的值 JSON 组合器写入

Overwrite value of Play JSON Combinator Writes

假设我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))

你可以这样做:

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
  )
}

这应该有效:

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