【问题标题】:How to replace a JSON value in Play如何在 Play 中替换 JSON 值
【发布时间】:2013-01-16 22:23:47
【问题描述】:

如何在 Play 中替换 JSON 值中的值?
代码说明:

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对您有帮助,请选择它作为接受的答案。

标签: json scala playframework-2.0 playframework-2.1


【解决方案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 之前版本中的现有值)

【讨论】:

【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多