Переменная jq, кажется, скрыла оригинальный ввод - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь разобрать некоторые json и поместить определенные разделы в переменные. Я думаю, что я не понимаю что-то о том, как работают переменные.

Json:

{
  "resources": [
    {
      "type": "Microsoft.ApiManagement/service/apis"
    },
    {
      "type": "Microsoft.ApiManagement/service/apis/schemas"
    }
  ]
}

Затем с помощью этого jq:

.resources[] | select(.type == "Microsoft.ApiManagement/service/apis") as $apis | { types: [.type], apis: $apis}

я получаю это :

{
  "types": [
    "Microsoft.ApiManagement/service/apis"
  ],
  "apis": {
    "type": "Microsoft.ApiManagement/service/apis"
  }
}

Когда я ожидал этого:

{
  "types": [
    "Microsoft.ApiManagement/service/apis",
    "Microsoft.ApiManagement/service/apis/schemas"
  ],
  "apis": {
    "type": "Microsoft.ApiManagement/service/apis"
  }
}

https://jqplay.org/s/4aeBOY9x6q

В соответствии с разделом переменных jq manual

Выражение exp как $ x | ... означает: для каждого значения выражения exp запустите остальную часть конвейера со всем исходным вводом, и для этого значения установите $ x. Таким образом, поскольку он функционирует как нечто вроде foreach l oop.

, что заставляет меня думать, что .type должен возвращать исходный набор, а не отфильтрованный результат, который я хранил в $ apis. Где разъединение?

1 Ответ

0 голосов
/ 20 февраля 2020

Это select, который "скрывает" некоторые входные данные.

Чтобы получить ожидаемый результат, самое простое - вообще не использовать переменные. Вы могли бы, например, просто написать:

.resources[].type
...