2016-11-17 10 views
2

私のコードでは、jsonを取得するためにサーバーにリクエストを行い、その後に値を更新してから送り返します。私は、キーがトップレベルにあった場合、私は変更したいキーが内の層のカップルであれば、私はそれを更新するための良い方法を把握することはできませんが、私はちょうどスカラーのJsObjectのネストされたキーを更新するには

val newConfig = originalConfig ++ Json.obj("key" -> newValue) 

を書き込むことによって、キーを更新できることを知っています

ie。私のJSONはこのようになります、と私はちょうどKEY5

{ 
    "key1": "value", 
    "key2": { 
     "key3": "value", 
     "key4": { 
      "key5": "value", 
      "key6": "value" 
     } 
    } 
} 

を更新したい、それを層ごとを更新せずにこれを行うにはそこに方法は何ですか? すなわち

val key4 = originalKey4 ++ Json.obj("key5" -> newValue) 
val key2 = originalKey2 ++ Json.obj("key4" -> key4) 
val newJson = originalJson ++ Json.obj("key2" -> key2) 

私が更新したい実際のキーは7層ありますので、これはやや面倒です。

答えて

1

json transformers

import play.api.libs.json._ 

val str = """{ 
      | "key1": "value", 
      | "key2": { 
      |  "key3": "value", 
      |  "key4": { 
      |   "key5": "value", 
      |   "key6": "value" 
      |  } 
      | } 
      |}""".stripMargin 

val json = Json.parse(str) 

val transformer = (__ \ 'key2 \ 'key4 \ 'key5).json.update(
    __.read[JsString].map(_ => Json.toJson("updated value")) 
) 

val result = json.transform(transformer).asOpt.get 

Json.prettyPrint(result) 

res0: String = { 
    "key1" : "value", 
    "key2" : { 
    "key3" : "value", 
    "key4" : { 
     "key5" : "updated value", 
     "key6" : "value" 
    } 
    } 
} 
を見てください
関連する問題