更新Scala中键值的Jsobject键

时间:2017-03-22 22:30:33

标签: scala jsobject

我知道我们可以通过键更新JsObject,但是,如何在JsObject中更新key的键。

例如,

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

我可以获取字符串值,但是,如何更新呢?

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

这不起作用。

1 个答案:

答案 0 :(得分:0)

解决方案1 ​​

您应该阅读JsPath上的文档。您正在寻找的方法是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