извлечь значение из подмассива или вернуть ноль, используя jq - PullRequest
1 голос
/ 16 июня 2019

Итак, с учетом этого ввода

{
    "id": 1,
    "tags": [
        {
            "Key": "Name",
            "Value": "I am id 1"
        },
        {
            "Key": "Else",
            "Value": "Random"
        }
    ]
}
{
    "id": 2,
    "tags": null
}

Я хотел бы получить id и значение name, если существует. Поэтому для этого ввода я хотел бы получить следующий вывод.

{
  "id": 1,
  "name": "I am id 1"
}
{
  "id": 2,
  "name": null
}

Я пытался сделать:

jq '{"id": .id, "name": .tags[]|select(.Key=="Name").Value}'

но, несмотря на то, что он извлекает этот ключ, он не может дать null или значение по умолчанию, когда путь не существует.

Есть идеи, как это решить?

Вы можете попробовать в этом jqplay: https://jqplay.org/s/GgXZg67o79

1 Ответ

1 голос
/ 16 июня 2019

Использование jq 1.5 или более поздней версии

{id, name: (.tags | if . then from_entries.Name else . end )}

или если у вас достаточно свежая (после 1.6) версия jq, вы можете опустить else .:

{id, name: (.tags | if . then from_entries.Name end )}

Альтернатива для jq 1.3 и выше

{id, name: (.tags // {} | .[] | select(.Key=="Name").Value // null)}

См. Также комментарии ниже.

...