【问题标题】:Overwrite value of Play JSON Combinator Writes覆盖 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))

【问题讨论】:

    标签: json playframework playframework-2.4


    【解决方案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 映射代码要干净得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多