Как объединить несколько объектов вывода в один объект с помощью jq

Я пытаюсь проанализировать вывод файла состояния терраформирования.

{
    "version": 3,
    "terraform_version": "0.9.3",
    "serial": 0,
    "lineage": "ae1f2572-8fa6-4977-be73-3deac7529eff",
    "modules": [
        {
            "path": [
                "root"
            ],
            "outputs": {
                "elb_dns_name": {
                    "sensitive": false,
                    "type": "string",
                    "value": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
                }
            },
            "resources": {},
            "depends_on": []
        },
        {
            "path": [
                "root",
                "elb"
            ],
            "outputs": {
                "dns_name": {
                    "sensitive": false,
                    "type": "string",
                    "value": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
                }
            },
            "depends_on": []
        },
        {
            "path": [
                "root",
                "sg"
            ],
            "outputs": {
                "security_group_id": {
                    "sensitive": false,
                    "type": "string",
                    "value": "sg-5a677425"
                }
            },
            "depends_on": []
        },
        {
            "path": [
                "root",
                "web"
            ],
            "outputs": {
                "web_instance_ids": {
                    "sensitive": false,
                    "type": "string",
                    "value": "i-03676fa6ba43fbb9f,i-09f51a313146856cd"
                },
                "web_public_ips": {
                    "sensitive": false,
                    "type": "string",
                    "value": "34.207.194.186,34.203.236.205"
                }
            },
            "depends_on": []
        }
    ]
}

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

{
  "elb_dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com",
  "dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com",
  "security_group_id": "sg-5a677425",
  "web_instance_ids": "i-03676fa6ba43fbb9f,i-09f51a313146856cd",
  "web_public_ips": "34.207.194.186,34.203.236.205"
}

Я могу вернуть только отдельные объекты, используя этот .modules[] | .outputs | to_entries | map({(.key) : .value.value }) | add.

{
  "elb_dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
}
{
  "dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
}
{
  "security_group_id": "sg-5a677425"
}
{
  "web_instance_ids": "i-03676fa6ba43fbb9f,i-09f51a313146856cd",
  "web_public_ips": "34.207.194.186,34.203.236.205"
}

Поэтому по какой-то причине я не могу публиковать сообщения, потому что stackoverflow говорит, что у меня слишком много кода и недостаточно деталей ... так что теперь я делаю запись в дневнике, чтобы набрать достаточно, чтобы я мог нажать кнопку отправки ... любой минута ... любое количество персонажей сейчас ...

Итак, когда я не создаю Code Pipelines на работе, мне очень нравится играть в dota2. Только я думаю, что у меня это довольно дерьмово. Я имею в виду, что у меня 1200 часов в игре, а я все еще как мусор с 1.5k MMR.

Не слишком много кода, слишком много данных. Вы ожидаете, что читатели проанализируют весь ваш набор данных о проблемах, тогда как ваша проблема должна быть продемонстрирована в 1/2, 1/3, 1/4 данных, которые вы включили. Прочтите, пожалуйста, про минимальный воспроизводимый пример ;-). Удачи.

shellter 05.04.2018 23:04

@shellter Я думаю, что в этом случае потребовалось включить весь набор данных. Если вы посмотрите на запрос, который я пробовал, и на найденное мной решение, вы увидите, что мне пришлось начинать все сначала. Я мог бы обрезать ключ ресурсов, который составляет большую часть текста, но я не чувствовал, что включение всего объекта было плохим делом, и я все еще не делаю этого.

Levi 05.04.2018 23:34
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
3
2
505
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В итоге я нашел решение, но это заняло больше времени, чем должно было (часы). В принципе, если в какой-то момент вы потеряете , в своих списках, значит, вы где-то напортачили.

Это то, что я использовал .modules | map(.outputs | to_entries[] | {(.key): .value.value}) | add

Это работает, но может быть лучше.

Ответ принят как подходящий

Использование map_values дает более простой (или, по крайней мере, более короткий) фильтр и может быть более эффективным:

.modules | map(.outputs | map_values(.value) ) | add

Другие вопросы по теме