2017-03-22 1 views
0

키로 JsObject를 업데이트 할 수 있다는 것을 알고 있었지만 JsObject에서 키의 키를 업데이트하려면 어떻게해야합니까? 예를 들어 스칼라에서 키 값의 Jsobject 키 업데이트

, 내가 문자열 값을 얻을 수 있습니다

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

그러나, 어떻게 업데이트 할 수 있습니다?

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

이것은 작동하지 않았습니다.

답변

0

당신은 JsPath에 설명서를 읽어야 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