【问题标题】:Add key/value to existing JsValue in Scala将键/值添加到 Scala 中的现有 JsValue
【发布时间】:2017-01-07 13:55:28
【问题描述】:

我是 Scala 新手,我正在尝试弄清楚如何将键/值添加到 JsValue。在 JavaScript 中,您可能会执行类似 SomeObject.newKey = newValue 的操作。这是我的真实用例:

  def doAccountUpdate(account: db.models.Account, config: JsObject, job: JsValue) : JsValue = {
    val passwordParam = (job \ "params" \ "password")
    if (passwordParam.toOption.isDefined) {
      val password = (job \ "params" \ "password").get.as[String]
      val encrypted_password = Auth.passwordEncrypt(password)
      // ADD `encrypted_password`'s value TO `job \ params` so its `job \ params \ encryptedPassword`
    }

    Account.update(account, config, job)
  }

Account.update 实际上更新了数据库,所以在我的doAccountUpdate 中我正在准备数据。我需要准备的其中一项是密码,在将其传递给Account.update之前对其进行加密。我该怎么做?

编辑

为了解释为什么这个被标记为重复的问题对我不起作用,这是他们的例子:

jsonObject.as[JsObject] + ("c" -> Json.toJson(3))

如果我在我的代码中复制它,它将如下所示:

updateJob = job.as[JsObject] + ("encryptedPassword" -> Json.toJson(encrypted_password))

但是输出:

{
    "id":"...",
    "params": {
        "password":"Programmer2!"
    },
    "encryptedPassword":"$2a$10$EHnJHXh1sTORxliPocWfDuHnlRzu1YwG.kyBee.u85apCXTuLij.y"
}

注意encryptedPassword 是如何不在params 中的

【问题讨论】:

标签: json scala playframework


【解决方案1】:

正如@danielnixon 建议的那样,您可以为此使用 JSON 转换器。这是一个例子:

val encryptPassword: Reads[JsObject] = (__ \ "params").json.update(
  (__ \ "password").read[String].flatMap(pw =>
    (__ \ "encryptedPassword").json.put(JsString(Auth.passwordEncrypt(pw)))
  )
)

这表明我们将:

  1. 更新params 对象
  2. 读取现有密码
  3. params 对象中添加一个新的encryptedPassword 分支

当您使用job.transform(encryptPassword) 应用它时,您将得到一个JsResult,如果params 对象存在并且有一个带有字符串值的password 字段,那么它将是JsSuccess - 否则您将得到@ 987654329@。您可以通过以下方式处理:

def doAccountUpdate(account: db.models.Account, config: JsObject, job: JsValue) : JsValue = {
  job.transform(encryptPassword) match {
    case JsSuccess(newJob, _) => Account.update(account, config, newJob)
    case JsError(errors) => sys.error("No password supplied!")
  }
}

【讨论】:

  • 谢谢!这非常有帮助!
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2020-04-12
  • 2014-01-10
  • 2014-09-23
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多