首页 > 解决方案 > 如何在scala中更新嵌套的JSON数组

问题描述

我是 scala/play 的新手,我一直在尝试更新(添加新的 id 到) JSONquery中的数组,sections[1]但我没有成功遍历 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 数组的特定字段中。我在整个应用程序中使用播放 JSON 库?

标签: jsonscalaplayframework

解决方案


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

推荐阅读