JQ: как получить элементы из списков одного типа? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть такой json:

{
    "datasets": [
        {
            "features": [
                {
                    "name": "aaa",
                    "stringStats": {
                        [...]
                        },
                    "type": "STRING",
                },
                {
                    "name": "bbb",
                    "numStats": {
                        [...]
                        },
                    "type": "FLOAT",
                },
                {
                    "name": "ccc",
                    "stringStats": {
                        [...]
                },
                    "type": "STRING",
                }
            ]
        }
    ]
}

Я хочу получить все элементы в [...] из всех списков "stringStats".

Мне удалось выполнить запрос jqчтобы получить все элементы, но я не знаю, как фильтровать и выполнять итерации из определенного вида списка.

Ответы [ 3 ]

1 голос
/ 05 ноября 2019

Если вам нужно в качестве формата массива использовать ниже,

[.datasets[].features[].stringStats // empty ]

Если вам нужно в качестве объектов использовать ниже,

.datasets[].features[].stringStats // empty

https://jqplay.org/s/-sZ7tvU4Yb

0 голосов
/ 05 ноября 2019

Вы можете использовать карту для перебора всех значений массива и делать то, что вы хотите.

Данные для моего примера

[
  {        "v": "1",        "t": "i"      },
  {        "v": "a",        "t": "s"      },
  {        "v": "1.1",      "t": "f"      },
  {        "v": "b",        "t": "s"      },
  {        "v": "2",        "t": "i"      }
]

пример, где я извлекаю только когда t = "i"

e444$ cat e.json | jq 'map(.| if .t == "i" then . else empty end )'
[
  {
    "v": "1",
    "t": "i"
  },
  {
    "v": "2",
    "t": "i"
  }
]

пример, где я извлекаю только когда t = "s"

e444$ cat e.json | jq 'map(.| if .t == "s" then . else empty end )'
[
  {
    "v": "a",
    "t": "s"
  },
  {
    "v": "b",
    "t": "s"
  }
]
0 голосов
/ 05 ноября 2019

Вот подход, использующий recursive descent .., optional object identifier .? и values

.. | .stringStats? | values
...