如何在 scala 中更新嵌套的 JSON 数组

How to update nested JSON array in scala

我是 scala/play 的新手,我一直在尝试更新(添加新 ID)[=19=sections[1] 中的 query 数组=] 但我没有成功遍历 JSON,因为我对变压器及其使用方法知之甚少。


  "definitions": [
    {
      "sections": [
        {
          "priority": 1,
          "content": {
            "title": "Driver",
            "links": [
              {
                "url": "https://blabla.com",
                "text": "See all"
              }
            ]
          },
          "SearchQuery": {
            "options": {
              "aggregate": true,
              "size": 20,
            },
            "query": "{\"id\":{\"include\":[\"0wxZ4Nr2\", \"0wxZbNr2\", \"6WZOPMw1\"}}"
          }
        },
        {
          "priority": 2,
          "content": {
            "title": "Deliver",
            "links": [
              {
                "url": "https://blabla.com",
                "text": "See all"
              }
            ]
          },
          "SearchQuery": {
            "options": {
              "aggregate": true,
              "size": 20,
            },
            "query": "{\"id\":{\"include\":[\"2W12Q2wq\", \"Nwq09lW3\", \"QweNN2d9\"]}}"
          }
        }
  ]
}

有关如何实现此目标的任何建议。我的目标是将值放入 JSON 数组的特定字段中。我在整个应用程序中都在使用 play JSON 库吗?​​

如您所见,如果您使用 PlayJSON,则可以使用 Json Transformers

更新字段的工作方式如下:

val queryUpdater = (__ \ "definitions" \ 1 \ "SearchQuery" \ "query").json.update(
  of[JsString].map {
    case JsString(value) =>
      val newValue: String = ... // calculate new value
      JsString(newValue)
  }
)

json.transform(queryUpdater)

如果您需要更新所有查询,则更像是:

val updateQuery = (__ \ "SearchQuery" \ "query").json.update(
  of[JsString].map {
    case JsString(value) =>
      val newValue: String = ... // calculate new value
      JsString(newValue)
  }
)

val updateQueries = (__ \ "definitions").json.update(
  of[JsArray].map {
    case JsArray(arr) =>
      JsArray(arr.map(_.transform(updateQuery)))
  }
)

json.transform(updateQueries)