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

时间:2020-05-12 00:39:53

标签: json scala playframework

我是scala / play的新手,我一直在尝试更新JSON query中的sections[1]数组(向其中添加新的id),但是我没有我对JSON以及如何使用它一无所知,因此可以成功遍历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库吗?

1 个答案:

答案 0 :(得分:1)

您注意到,如果您使用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)