从子数组中提取值或使用jq

时间:2019-06-15 23:37:38

标签: json command-line jq

因此,输入

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

我想获取idname的值(如果存在)。因此,对于该输入,我想获得以下输出。

{
  "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 个答案:

答案 0 :(得分:1)

使用jq 1.5或更高版本

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

或者如果您有足够新的jq版本(1.6后),则可以省略else .

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

jq 1.3及更高版本的替代

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

另请参阅下面的评论。