Карта условных дочерних элементов - PullRequest
0 голосов
/ 30 марта 2020

Я работаю с файлом JSON, который содержит много данных, которые можно удалить перед отправкой в ​​API.

Обнаружил, что для этого можно использовать JQ, но не уверен в том, как отобразить чтобы получить желаемые результаты.

Ввод JSON

  {
    "name": "Sample name",
    "id": "123",
    "userStory": {
      "id": "234",
      "storyName": "Story Name",
      "narrative": "Narrative",
      "type": "feature"
    },
    "testSteps": [
      {
        "number": 1,
        "description": "Step 1",
        "level": 0,
        "children": [
          {
            "number": 2,
            "description": "Description",
            "children": [
              {
                "number": 3,
                "description": "Description"
              }
            ]
          },
          {
            "number": 4,
            "anotherfield": "another field"
          }
        ]
      }
    ]
  }

Желаемый вывод

{
  "name": "Sample name",
  "userStory": {
    "storyName": "Story Name"
  },
  "testSteps": [
    {
      "description": "Step 1",
      "children": [
        {
          "description": "Description",
          "children": [
            {
              "description": "Description"
            }
          ]
        },
        {
          "anotherfield": "anotherfield"
        }
      ]
    }
  ]
}

Попытался сделать это с помощью следующей команды jq

map_values(..|{name, id, userStory})

, но не уверен, как фильтровать только userStory.storyName.

Заранее спасибо.

Примечание: Фактический JSON имеет различные дочерние элементы, которые в некоторых случаях повторяются.

1 Ответ

0 голосов
/ 30 марта 2020

Удалить .id из root объекта:

del(.id)

Оставить только .storyName в .userStory:

.userStory |= {storyName}

Удалить .number и .level от каждого объекта на любом уровне в .testSteps:

.testSteps |= walk(if type == "object" then del(.number, .level) else . end)

Собираем все вместе:

del(.id) | (.userStory |= {storyName}) | (.testSteps |=
  walk(if type == "object" then del(.number, .level) else . end))

Демонстрация онлайн

...