在Scala中过滤和更新JSON

时间:2018-10-26 19:18:56

标签: json scala

我有以下JSON

  

Json

{
    "components": {
        "id": "application",
        "actions": [{
            "action": "/show-dashboard",
            "text": {
                "en": "Dashboard",
                "es": "Dashboard-ES"
            }
        }, {
            "action": "/showContact",
            "text": {
                "en": "Personal",
                "es": "Personal-ES"
            }
        }, {
            "action": "/showSummary",
            "text": {
                "en": "Summary",
                "es": "Summary-ES"
            }
        }]
    }
}

我需要过滤动作。只有两个是可能的(此json较小,原始有20多个动作)

所以我有一个名为json的JsObject。然后我用了

  

斯卡拉

    val filteredActions = (components \\ "actions").head.as[List[JsValue]].filter{ _.\("action").as[String] match {
    case "/showContact" => true
    case "/showSummary" => true
    case _ => false
  }}

所以我在filteredActions中有一个过滤了动作的json字符串,现在我需要更新组件并将当前动作替换为该动作。

我已经尝试过了

  

斯卡拉

 val jsonTransformer2 = (__ \ 'components \ 'actions).json.update((__ \ 'components).json.put(Json.arr(filteredActions)))

 val filtered = components.transform(jsonTransformer2) 

但是不起作用。

请提供任何建议。

预先感谢

2 个答案:

答案 0 :(得分:0)

您期望得到什么结果?
如果您只想删除操作

中的操作/show-dashboard
val jsonTransformer2 = (__ \ 'components \ 'actions).json.put(JsArray(filteredActions))
val filtered         = components.transform(jsonTransformer2)
println(filtered.get)

//结果

{
  "components": {
    "actions": [
      {
        "action": "/showContact",
        "text": {
          "en": "Personal",
          "es": "Personal-ES"
        }
      },
      {
        "action": "/showSummary",
        "text": {
          "en": "Summary",
          "es": "Summary-ES"
        }
      }
    ]
  }
}

答案 1 :(得分:0)

感谢您的帮助。它确实帮助我更好地了解了它的工作原理。

我找到了解决方法。

只需将变压器更改为此:

  

斯卡拉

val jsonTransformer2 = (__ \ 'components \ 'actions).json.update((__ \ 'components \ 'actions).json.put(JsArray(filteredActions)))

再次感谢大家。