Используя jq: выбирайте только родителей с определенным дочерним ключом - PullRequest
0 голосов
/ 13 февраля 2019

Пример json:

{
  "version": "3",
  "services": {
    "web": {
      "build": "web"
    },
    "redis": {
      "image": "redis"
    },
    "datadog": {
      "build": "datadog"
    },
    "another": {
      "image": "mysql"
    }
  }
}

Я хотел бы вернуть список служб, которые имеют ключ "build", а не ключ "image".Обратите внимание, что значение ключа сборки не может быть определено мной.

Вывод должен быть: ["web", "datadog"]

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вот третий подход, известный тем, что он не обращал внимания на верховья:

[(paths(scalars) 
  | select(.[-1] == "build")) as $p
 | getpath($p)]
0 голосов
/ 13 февраля 2019

Вот два способа работы:

1.

jq '.services
    | . as $services
    | keys_unsorted
    | map( select($services[.] | has("build")) )'

(разверните до .services, запомните его как $services для дальнейшего использования, получите список ключейи выберите такие, чтобы соответствующее значение в $services имело клавишу build).

2.

jq '.services
    | to_entries
    | map( select(.value | has("build")) | .key)'

(разверните до .services, преобразуйте всписок {"key": ..., "value": ...} объектов, выберите объекты, в которых .value имеет клавишу build, и верните .key для каждого).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...