2016-08-31 16 views
0

私はScalaには新しく、JsValueにどのようにキー/値を追加するかを考えようとしています。 JavaScriptではSomeObject.newKey = newValueのようなことをするかもしれません。ここに私の本当のユースケースです:Scalaの既存のJsValueにキー/値を追加する

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に私はデータを準備中だので、DBを更新します。私が準備する必要がある項目の1つは、パスワードをAccount.updateに渡す前に暗号化することです。これはどうすればいいですか?

EDIT

これは私のために動作しませんの重複をマークされている問題は、これが彼らの例です理由を説明する:

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が@danielnixonが示すように、あなたはこのためにJSONの変圧器を使用することができますparams

+0

[フレームワークを再生する - JSONオブジェクトにフィールドを追加]の可能複製(http://stackoverflow.com/questions/22855710/play-framework-add-aを-field-to-json-object) – danielnixon

+0

@danielnixonが私の場合にそれほど同じではない理由を説明するために更新されました。うまくいけば助けて –

+3

ここでケース4と5を見てみましょう:https://www.playframework.com/documentation/2.5.x/ScalaJsonTransformers – danielnixon

答えて

1

ではありませんどのように注意してください。次に例を示します。

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

これが言うには、私たちは以下となります。

paramsオブジェクト
  • paramsオブジェクトに新しいencryptedPassword支店を置く
  • 既存のパスワードを読ん
    1. 更新

    job.transform(encryptPassword)でそれを適用するとJsResultが表示され、paramsオブジェクトが存在し、文字列値のpasswordフィールドがある場合はJsSuccessになります。そうでない場合はJsErrorになります。あなたは、次のようなものであることを処理することができます:

    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!") 
        } 
    } 
    
  • +0

    ありがとう!これは非常に便利でした! –

    関連する問題