Как извлечь ключ с помощью jq на основе его дочерних значений - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь обработать некоторые JSON с помощью jq. В частности, мне нужен конкретный ключ на основе его дочернего значения. Приведен пример:

{
  "foo": {"primary": true, "blah": "beep"},
  "bar": {"primary": false, "blah": "narf"},
  "baz": {"primary": false, "blah": "poink"},
}

Мне нужна строка «foo», потому что это ключ, дочернее значение которого «primary» истинно. (Я могу гарантировать, что одна и только одна запись будет иметь primary = true , из-за того, что генерирует JSON.)

Пока что лучшее, что мне удалось сделать, это:

jq -r '.[] | select(.primary == true)'

Но это возвращает значение "foo", а не Сама строка "foo". Пока копалась в руководстве, я не нашла способа получить ключ конкретно.

Какие-нибудь указатели вы можете предоставить?

1 Ответ

2 голосов
/ 27 мая 2020

Вам нужно «разбить» ваш объект на массив записей, например,

[
  {
    "key": "foo",
    "value": {
      "primary": true,
      "blah": "beep"
    }
  }
  //...
]

Затем вы можете отфильтровать с помощью .value.primary и сопоставить результат с .key:

to_entries | map(select(.value.primary)  | .key)

Возвращает:

[
  "foo"
]

Или чтобы получить только первый элемент массива: (Спасибо @nbari)

to_entries | map(select(.value.primary)  | .key)[0]
...