首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新Scala中键值的Jsobject键

更新Scala中键值的Jsobject键
EN

Stack Overflow用户
提问于 2017-03-22 22:30:33
回答 1查看 1.4K关注 0票数 0

我知道我们可以按键更新JsObject,但是如何在JsObject中更新密钥呢?

例如,

代码语言:javascript
复制
val queryText = (Json.parse(normalQuery) \"query" \"query_string" \"query").as[String]

我可以得到字符串值,但是如何更新它呢?

代码语言:javascript
复制
  updatedJson ++ Json.obj("query/query_string/query" -> Json.toJson("new_test"))

这是行不通的。

EN

回答 1

Stack Overflow用户

发布于 2017-03-22 22:56:04

解决方案1

您应该阅读有关JsPath的文档。你要找的方法是JsPath.json.update

代码语言:javascript
复制
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

您也可以像尝试的那样使用++添加字段,但是您需要正确地定义对象:

代码语言:javascript
复制
val overrider = Json.obj("query" -> Json.obj("query_string" -> Json.obj("query" -> "new_value")))

val badOverriden = baseJson ++ overrider

实际上,这不起作用,因为++不是递归的:它只覆盖JSON对象顶层的字段。但是,您可以使用同样的deepMerge,递归地:

代码语言:javascript
复制
val overriden = baseJson deepMerge overrider
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42963864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档