Фильтрация и обновление 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 действий)

Итак, у меня есть JsObject, называемый компонентами с этим json. Тогда я использовал это

Scala

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

Итак, у меня есть в filterActions строка json с отфильтрованными действиями, теперь мне нужно обновить компоненты и заменить текущие действия на это.

Я пробовал это:

Scala

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

 val filtered = components.transform(jsonTransformer2) 

Но не работает ..

Любой совет, пожалуйста.

заранее спасибо

Привет, Алехандро, какую json-библиотеку вы используете?

Roberto Bonvallet 26.10.2018 21:23

Я использую play.api.libs.json._ для scala 2.4

Alejandro 26.10.2018 21:52

Как именно не работает? Выдает исключения или просто не обновляет полезную нагрузку?

J0HN 27.10.2018 08:16

Сгенерирован неправильный JSON

Alejandro 29.10.2018 02:52
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
4
472
2

Ответы 2

каких результатов вы ожидаете?
если вы просто хотите убрать действие /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"
        }
      }
    ]
  }
}

Привет, спасибо, это хороший прогресс. но я теряю идентификатор. Вот что я получаю:> Json {"components": {"actions": [{"action": "/ showContact", "text": {"en": "Personal», "es": "Personal -ES "}}, {" action ":" / showSummary "," text ": {" en ":" Summary "," es ":" Summary-ES "}}]}}

Alejandro 29.10.2018 02:38

Спасибо за помощь. Это действительно помогло мне лучше понять, как это работает.

Я нашел решение.

Просто нужно сменить трансформатор на такой:

Scala

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

Еще раз спасибо всем.

Другие вопросы по теме