Комбинируйте и повторно вводите несколько объектов в jq - PullRequest
0 голосов
/ 28 февраля 2019

Я начинаю с файла JSON с несколькими объектами

{
  "name": "foo",
  "url": "https://zombo.com"
}
{
  "name": "bar",
  "url": "https://acme.com"
}

и пытаюсь объединить их в один объект с атрибутом name в качестве ключа:

{
  "widgets": {
    "foo": {
      "url": "https://zombo.com"
    },
    "bar": {
      "url": "https://acme.com"
    }
  }
}

Некоторое время я бился головой об этом, и я думаю, что довольно близок к следующему запросу:

{ widgets: (reduce . as $item ({}; . + {($item.name): {url: $item.url}})) }

Однако, это приводит к нескольким объектам, и язаканчиваются идеи.

jqplay доступен здесь: https://jqplay.org/s/SI7XEMb5l9.

Ответы [ 2 ]

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

Я бы сделал это так: this :

jq -s '{ widgets: map( { (.name): {url} } ) | add }'
  • -s (--slurp) объединяет объекты в массив объектов
  • map( { (.name): { url } } ) изменяет форму каждого объекта
  • add объединяет элементы массива в один объект
  • и, наконец, я строю объект с { widgets: ... }.
0 голосов
/ 28 февраля 2019

Используйте reduce с inputs:

jq -n '{ widgets : (reduce inputs as $p ({}; . + ($p | { (.name) : { url } }))) }' file
...