19

PlayでJSON値の値を置き換えるにはどうすればよいですか?
説明するコード:

def newReport() = Action(parse.json) { request =>
    var json = request.body
    if((json \ "customerId").as[Int] == -1){
      // replace customerId after some logic to find the new value
    }
    json.validate[Report](Reports.readsWithoutUser).map {
      case _: Report =>
4

5 に答える 5

4

1 つのアプローチは、Marc B が言うように、JSON をケース クラスのようなものに変換し、それを操作してから、新しい JSON を作成することです。

ただし、JSON 'トランスフォーマー' も使用できます。実際に行うことは、Reads[SomeThing] オブジェクトを構築することです。このオブジェクトは、JSON オブジェクトで呼び出す変換メソッドに渡されます。JSON オブジェクトを変更し、成功 (結果) または失敗 (エラー) を返します。結果は、新しく変更された JSON です。(比較的)非常に単純な例を次に示します。

次の形式の json を使用: {key -> value}

def jsonXForm(value: String) = (__ \ "customerId").json.update(
  (__ \ "customerId").json.put(JsString(value))
)
json.transform(jsonXForm(yourNewValue)) match {...}`

ここまともなガイドがあります

于 2016-02-25T22:01:01.740 に答える
2

次のようなもの:

val updatedJson = if((request.body \ "customerId").as[Int] == -1){
  val newId = JsObject(Seq(("customerId",JsString("ID12345"))))
  (request.body ++ newId).as[JsValue]
} else request.body

updatedJson.validate[Report](Reports.readsWithoutUser).map {
  case _: Report =>
于 2013-02-08T00:31:04.867 に答える
2

これらすべての不変の「JSON」ソリューションから離れることを検討しています。それはコードをひどく混乱させるだけです。これは、 JSON の SON でどのように見えるかです:

import nl.typeset.sonofjson._

val json = …
if (json.customerId.as[Int] == -1) {
  json.customerId = 987938
}
于 2014-09-21T10:44:58.137 に答える
0

暗黙の変換を使用する Zeimyth の回答の美化されたバージョン

implicit class JsObjectEnhancer(jsObject: JsObject) {
  def update(args: (String, Json.JsValueWrapper)*): JsObject = {
    jsObject ++ Json.obj(args: _*)
  }
}

使用法(json は JsObject 型である必要があり、暗黙的なクラスはスコープ内にある必要があります)

json.update("customerId", 1000)
于 2017-01-03T04:34:25.380 に答える