jq - 选择具有给定键名的对象

时间:2014-04-24 12:10:18

标签: json jq

我有一个具有多个级别的任意结构等。我需要选择包含名为updateDate的键的所有对象。我怎么用jq做到这一点?我想出了一种方法,但是当它访问一个我必须要写的叶子时,它也会在无效数据类型上产生错误:

jq 'recurse(.[]) | has("updateDate")' | grep -Fv error

我真的不懂如何检查类型或叶子,我怀疑有更简单的方法来实现我想要的东西?

3 个答案:

答案 0 :(得分:16)

在1.4中你可以:

jq '..|.updateDate?'

如果你坚持使用1.3,你可以使用更长的程序:

jq 'recurse(if type == "array" or type = "object" then .[] else empty end) | if type == "object" then .updateDate else empty end'

答案 1 :(得分:1)

未经过测试:jq 'recurse(.[]?) | objects | has("updateDate")'怎么样?

答案 2 :(得分:0)

对于没有没有键的每个对象,接受的答案还会产生null

对我有用的是:

jq '..|objects|.updateDate//empty'

.updateDate//empty部分的意思是:如果.updateDatenull(或false),则完全跳过它。

如果您期望密钥的值为falsenull,那么这当然是行不通的。在这种情况下,请使用:

jq '..|objects|select(has("updateDate"))|.updateDate'
相关问题