Как я могу использовать jq для поиска всех путей в объекте JSON, в которых значение соответствует заданным критериям?

Есть ли способ использовать jq для поиска всех путей, содержащих значение, соответствующее заданным критериям?

Например, учитывая следующий JSON, я хотел бы вернуть все пути, где значение age> 35, независимо от глубины структуры, содержащей это поле:

{  
  "springfield":{  
    "marge":{  
      "age":30
    },
    "homer":{  
      "age":40,
      "job":"xyz"
    }
  },
  "shelbyville":{  
    "zone1":{  
      "john":{  
        "age":10
      }
    },
    "zone2":{  
      "mark":{  
        "age":50
      }
    }
  },
  "homeless1":{  
    "age":25
  },
  "homeless2":{  
    "age":60
  }
}

Таким образом, выполнение даст что-то вроде:

[
  ["springfield", "homer"],
  ["shelbyville", "zone2", "mark"],
  ["homeless2"]
]

person rewbs    schedule 09.09.2015    source источник


Ответы (2)


Это должно помочь:

[paths(.age?>35)]
person Community    schedule 09.09.2015

Следующее было протестировано с jq 1.4 и jq 1.5:

$ jq -M -c '(paths | select(.[length-1] =="age")) as $path
    | if (getpath($path) > 35) then $path else empty end' ages.json
["springfield","homer","age"]
["shelbyville","zone2","mark","age"]
["homeless2","age"]

Для следующего требуется jq 1.5:

$ jq -c --stream 'select(length == 2 and .[0][-1] == "age" 
    and .[1] > 35)' ages.json
[["springfield","homer","age"],40]
[["shelbyville","zone2","mark","age"],50]
[["homeless2","age"],60]

Их можно легко адаптировать для получения аналогичного результата.

person peak    schedule 09.09.2015