如何在 Play 中替换 JSON 值
Posted
技术标签:
【中文标题】如何在 Play 中替换 JSON 值【英文标题】:How to replace a JSON value in Play 【发布时间】:2013-01-16 22:23:47 【问题描述】:中的值? 代码说明:
def newReport() = Action(parse.json) request =>
var json = request.body
if((json \ "customerId").as[Int] == -1)
// replace customerId after some logic to find the new value
json.validate[Report](Reports.readsWithoutUser).map
case _: Report =>
【问题讨论】:
您不会操纵 json 字符串。在那条路上充满了疯狂。您将 json 字符串转换为本机数据结构,操作该结构,然后重新编码为 json。 点赞 MarcB,或使用 Json Coast2Coast 功能 mandubian.com/2012/10/29/… 如果my answer对您有帮助,请选择它作为接受的答案。 【参考方案1】:根据Play Documentation,JsObjects 有一个方法++
可以合并两个JsObjects。所以,当你有了新的整数值时,你只需要:
val updatedJson = json.as[JsObject] ++ Json.obj("customerId" -> newValue)
从 Play 2.4.x 开始,您可以使用 +
:
val updatedJson = json.as[JsObject] + ("customerId" -> newValue)
(注意:+
方法已在 2.1.x 中添加,但向对象添加了重复字段,而不是替换 2.4.x 之前版本中的现有值)
【讨论】:
Json Transformers (coast to coast) 是目前的标准【参考方案2】:正如 Marc B 所说,一种方法是将 JSON 转换为类似案例类的东西,对其进行操作,然后创建一个新的 JSON。
不过,您也可以使用 JSON“转换器”。实际上,您所做的是构建一个 Reads[SomeThing] 对象。该对象被传递给您在 JSON 对象上调用的转换方法。它将更改 JSON 对象并返回 Success(result) 或 Failure(error),其中 result 是新修改的 JSON。这是一个(比较)非常简单的例子:
使用json格式:key -> value
def jsonXForm(value: String) = (__ \ "customerId").json.update(
(__ \ "customerId").json.put(JsString(value))
)
json.transform(jsonXForm(yourNewValue)) match ...`
有一个不错的指南here
【讨论】:
【参考方案3】:类似的东西:
val updatedJson = if((request.body \ "customerId").as[Int] == -1)
val newId = JsObject(Seq(("customerId",JsString("ID12345"))))
(request.body ++ newId).as[JsValue]
else request.body
updatedJson.validate[Report](Reports.readsWithoutUser).map
case _: Report =>
【讨论】:
由于 Play Json 数据结构是不可变的,因此您无法就地更新该值,但您可以创建一个新的 JsValue,除了更新的字段外,该 JsValue 相同。【参考方案4】:我正在考虑放弃所有那些不可变的“JSON”解决方案。它只是使代码变得一团糟。这就是它在SON of JSON 中的样子:
import nl.typeset.sonofjson._
val json = …
if (json.customerId.as[Int] == -1)
json.customerId = 987938
【讨论】:
【参考方案5】:使用隐式转换的 Zeimyth 答案的美化版本
implicit class JsObjectEnhancer(jsObject: JsObject)
def update(args: (String, Json.JsValueWrapper)*): JsObject =
jsObject ++ Json.obj(args: _*)
用法(json 必须是 JsObject 类型并且隐式类应该在范围内)
json.update("customerId", 1000)
【讨论】:
以上是关于如何在 Play 中替换 JSON 值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JSON 中的值替换为 RegEx 在使用 Python 的文件中找到的值?
如何在Java中获取JSON路径的所有输出路径,以便通过它们的函数替换现有值