2017-03-22 5 views
0

私はJsObjectをキーで更新できると知っていましたが、JsObjectのキーのキーを更新するにはどうすればよいですか?例えばScalaのキー値のJsobjectキーを更新します

val queryText = (Json.parse(normalQuery) \"query" \"query_string" \"query").as[String] 

しかし私は、どのように私はそれを更新することができ、文字列値を得ることができますか?

updatedJson ++ Json.obj("query/query_string/query" -> Json.toJson("new_test")) 

これは機能しませんでした。あなたはJsPath上のドキュメントを読んでください

答えて

0

ソリューション1

。あなたが探している方法はJsPath.json.updateです:

import play.api.libs.json._ 

val baseJson = Json.obj("query" -> Json.obj("query_string" -> Json.obj("query" -> "old_value"))) 

val updater: Reads[JsObject] = __.json.update((__ \"query" \"query_string" \"query").json.put(JsString("new_value"))) 

val updated: JsResult[JsObject] = baseJson.transform(updater) 

ソリューション2

あなたはまた、あなたがしようとしたとして++を使用してフィールドを追加することができますが、適切にオブジェクトを定義する必要があります。

val overrider = Json.obj("query" -> Json.obj("query_string" -> Json.obj("query" -> "new_value"))) 

val badOverriden = baseJson ++ overrider 

実際には、++は再帰的ではないため、実際には機能しません。これはJSONオブジェクトの最上位にあるフィールドをオーバーライドするだけです。ただし、再帰的に同じを行うdeepMergeを使用することができます。

val overriden = baseJson deepMerge overrider 
関連する問題