Как использовать значение в качестве ключевой ссылки в JQ? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть два JSON файла следующим образом.

Один содержит отображение проекта для владельцев.

owners.json

{
  "Project1": "owner1",
  "Project2": "owner2"
}

Второй содержит список проектов с дополнительной информацией:

projects.json

[
  {
    "name": "Project1",
    "base": "A"
  },
  {
    "name": "Project2",
    "base": "B"
  }
]

Я хотел бы использовать JQ для объединения двух файлов, чтобы они выглядели следующим образом:

output.json

[
  {
    "name": "Project1",
    "owner": "owner1",
    "base": "A"
  },
  {
    "name": "Project2",
    "owner": "owner2",
    "base": "B"
  }
]

Моей первой мыслью было попробовать что-то вроде этого (при условии, что projects.json подается на стандартный ввод):

jq --slurpFile owners owners.json '.name as $n | [.[] | {name, base, owner: $owners[0].$n}]'

Это дает синтаксическую ошибку, относящуюся к $n в $owners[0].$n. Какой правильный способ сделать это в JQ?

Спасибо!

1 Ответ

3 голосов
/ 08 апреля 2020

Вам необходимо заключить ссылки на переменные в квадратные скобки для индексации объектов по ним. Даже если вы исправили, что ваш скрипт не будет работать, хотя массивы нельзя индексировать строками (.name as $n part).

И не заморачивайтесь с slurpfile, есть более простые способы.

$ jq 'input as $owners | map(.owner = $owners[.name])' projects.json owners.json
[
  {
    "name": "Project1",
    "base": "A",
    "owner": "owner1"
  },
  {
    "name": "Project2",
    "base": "B",
    "owner": "owner2"
  }
]
...