scala play - 使用嵌套的JsValues编辑JsValue

时间:2014-09-02 15:14:46

标签: json scala playframework

这个问题不是特定于JsValue,它是scala中所有不可变对象的,我想编辑它的一部分,并保持其余的原样。 例如,我有这个对象:

"references": {
    "hsId": "37395615-244b-4706-b6f5-237272f07140",
    "others": {
      "path": "rewr",
      "externalId": "ewr",
      "version": "2"
    }
}

并且假设我只想编辑版本。

感谢

2 个答案:

答案 0 :(得分:1)

好吧我找到了一种解决方法, 但我觉得它是一个补丁而不是最好的答案

val references: JsObject = (json \ "references").as[JsObject]
val newVersion = JsObject(List(("others", JsObject(List(("version", JsString("3")))).as[JsValue])))
val newReferences = references.deepMerge(newVersion)

答案 1 :(得分:1)

您可以使用JSON transformers。我们想说我们要将版本更改为"3"

val js: JsValue = Json.parse("""
    {
        "references": {
            "hsId": "37395615-244b-4706-b6f5-237272f07140",
             "others": {
                 "path": "rewr",
                 "externalId": "ewr",
                 "version": "2"
             }
        }
    }
""")

// Define the transformer
val transformer =  (__ \ "references" \ "others").json.update(
   __.read[JsObject].map{o => o ++ Json.obj("version" -> "3")}
)

val newJs = js.transform(transformer)

这将复制整个对象,然后替换version分支上的others