2017-02-07 14 views
1

Я получаю Cannot iterate over null (null) из нижеследующего запроса, потому что .property_history нет в result объекте.Как проверить наличие «ключа» в jq перед итерацией по значениям

Как я могу проверить наличие ключа .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

есть ли основания для downvote? –

+0

Я не голосовал, но, возможно, люди хотели увидеть «JSON», в котором вы пытаетесь это сделать. Без этого люди не смогут определить, действительно ли вы пытаетесь сделать это или нет. – Inian

+0

@ Иниан, пожалуйста, зарегистрируйтесь сейчас –

ответ

4

Вы можете использовать select-expression в jq делать то, что вы собираетесь достичь, что-то как,

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

Вы можете использовать оператор ? после починки:

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

прохладный. Я пробовал это ... но это давало 'boolean'. Похоже, трюк: '. []' –