我有如下示例 JSON
{
"data": [
{
"name": "city",
"LIST": {
"ID": [
{
"value": "ny",
"name": "US"
},
{
"value": "lon",
"name": "GB"
},
{
"value": "Toronto",
"name": "CA"
}
]
}
},
{
"name": "city1"
}
]
}
我要获得如下值
city,ny
city1,
我只想要 name="US" 中的值jq
。
数组的每个元素的最大值为 1 name
=“US” data
。如果没有name
=“US”,那么我希望它为空白或 NULL。在上面的示例中,如果第二条记录没有name
=“US”,则输出将为city1,blank
or city1,
。
答案1
假设每个data
元素有最多.LIST.ID
其数组中的一个元素name
等于US
:
jq -r <file '.data[] |
[ .name, (.LIST.ID[] | select(.name == "US").value)? // null ] |
@csv'
它能做什么:
- 返回(保留)数组的所有元素
data
; - 对于 的每个元素
data
,创建一个两元素数组(CSV 格式化所需),其中包含:name
每个data
元素的属性值;- 其equals
value
的数组元素的属性值(如果有)(如果没有;您可以使用in 来在 CSV 输出中获取双引号字段来代替完全空的字段);括号表达式后的the确保即使或元素完全缺失也不会发生错误;.LIST.ID
name
US
null
""
null
?
.LIST
.ID
- 将生成的数组列表呈现为 CSV 数据。
答案2
本质上是一样的弗拉桑的回答.LIST.ID
,但是利用数组的元素可以转换为对象的事实,其中name
值是键,value
值是对应的值:
jq -r '.data[] | [.name, (.LIST.ID | from_entries? | .US) // "blank"] | @csv' file
使用给定的示例数据作为输入,这将生成以下无标头 CSV 数据:
"city","ny"
"city1","blank"
当数据中第二个字段不可用时,在表达式中更改// "blank"
为以生成空字段。// null
jq