考虑以下JSON输入:
{
"id":0,
"Tags": [
{"Key":"Name", "Value":"machine1"},
{"Key":"Stage", "Value":"UAT"}
]
},
{
"id":1,
"Tags": [
{"Key":"Stage", "Value":"UAT"}
]
},
{
"id":2,
"Tags": []
},
{
"id":3
}
我寻求一个解决方案,管道和选择之后将产生的任一值Value
,其中一个键字段Name
是Name
或(none)
作为缺省值。我得到的最接近的是:
jq -r 'if(.Tags == null or .Tags == []) then .Tags=[{"Key":"Name","Value":"(none)"}] else . end | "\(.id) \(.Tags[] | select(.Key == "Name")|.Value)" '
该解决方案适用于ID 0,2和3是当Tags
数组存在但并没有包含。重点==“名称”的选择率空,没有返回值。如果我对此稍作改动,我可能会偶然发现它,但是。理想情况下,我想执行以下操作(jq伪代码):
Defend against null tags, then walk array looking for Name
'\(.Tags // [{}] | select(.Tags[].Key == "Name")?.Value // "(none)")
可能只是我确实需要多一阶段,但我想探索其他聪明的可能性。
这个jq
脚本应该可以解决这个问题:
{
id,
name: (first(.Tags[] | select(.Key == "Name").Value)? // "(none)")
}
| "\(.id) \(.name)"
它的工作方式与您的伪代码相似,但不能主动防御.Tags
数组缺失或为空。没有特别的理由将其与存在但不包含Name
条目的情况区别对待。该程序只是尝试访问.Value
该Name
条目,并且如果由于某种原因根本不起作用,它将替换"(none)"
。
您可以将其放入文件中,也可以直接使用
$ jq -r '{id, name: ...} | "\(.id) \(.name)"' input.json
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句