如何在 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路径的所有输出路径,以便通过它们的函数替换现有值

Play框架JSON读取:如何读取String或Int?

如何在 Play 2.7 for Scala 中编写一个通用 JSON 解析器来验证入站请求?

如何解析JSON使用Play框架

如何使用Robot + Linux在json文件中以UTC(Zulu UTC)格式替换当前时间?