如何检查'密钥'是否存在在迭代值之前的jq中

时间:2017-02-07 18:36:20

标签: json bash shell jq array-key-exists

我从以下查询中获得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
         }
      ]
   }
}

5 个答案:

答案 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)

诀窍是将 //empty 一起使用:

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