我从以下查询中获得Cannot iterate over null (null)
,因为.property_history
对象中不存在result
。
在继续.property_history
之前,如何检查是否存在map(...)
密钥?
我尝试使用类似sold_year= `echo "$content" | jq 'if has("property_history") then
map(select(.event_name == "Sold"))[0].date' else null end
原始查询:
sold_year=`echo "$content" | jq '.result.property_history | map(select(.event_name == "Sold"))[0].date'`
JSON:
{
"result":{
"property_history":[
{
"date":"01/27/2016",
"price_changed":0,
"price":899750,
"event_name":"Listed",
"sqft":0
},
{
"date":"12/15/2015",
"price_changed":0,
"price":899750,
"event_name":"Listed",
"sqft":2357
},
{
"date":"08/30/2004",
"price_changed":0,
"price":739000,
"event_name":"Sold",
"sqft":2357
}
]
}
}
答案 0 :(得分:25)
您可以使用jq
中的select-expression来执行您想要达到的目标,例如,
jq '.result | select(.property_history != null) | .property_history | map(select(.event_name == "Sold"))[0].date'
"08/30/2004"
答案 1 :(得分:8)
您可以使用?
post-fix运算符:
$ jq '.result | .property_history? | .[] | select(.event_name == "Sold") | .date'
"08/30/2004"
答案 2 :(得分:3)
jq '.result.property_history // empty | map(select(.event_name == "Sold"))[0:1][].date'
另一种选择是使用额外的选择:
jq '.result.property_history | select(.) | map(select(.event_name == "Sold"))[0:1][].date'
答案 3 :(得分:0)
一般模式:
try (...) // "default_value"
按照你的逻辑:
jq 'try (.result.property_history | map(select(.event_name == "Sold"))[0].date) // "default_value"'
如果表达式失败,try
(没有捕获)返回空。如果值为空,//
提供默认值。
答案 4 :(得分:0)
使用 has("mykey1")
(用于对象)或 has(0)
(用于数组):
jq 'has("name")' <<< "{\"name\": \"hello\"}"
输出:
true