web-dev-qa-db-fra.com

Comment vérifier la présence de «clé» dans jq avant d'itérer sur les valeurs

J'obtiens Cannot iterate over null (null) à partir de la requête ci-dessous car .property_history N'est pas présent dans l'objet result.

Comment vérifier la présence de la touche .property_history Avant de continuer avec map(...)?

J'ai essayé d'utiliser quelque chose comme sold_year= `echo "$content" | jq 'if has("property_history") then map(select(.event_name == "Sold"))[0].date' else null end

Requête d'origine:

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
         }
      ]
   }
}
23
Rahul Dess

Vous pouvez utiliser select-expression dans jq pour faire ce que vous avez l'intention de réaliser, quelque chose comme,

jq '.result | select(.property_history != null) | .property_history | map(select(.event_name == "Sold"))[0].date'
"08/30/2004"
32
Inian

Vous pouvez utiliser le ? opérateur post-fix:

$ jq '.result | .property_history? | .[] | select(.event_name == "Sold") | .date'
"08/30/2004"
10
peak