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

Yur*_*ish 12 json jq

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

jq 'recurse(.[]) | has("updateDate")' | grep -Fv error
Run Code Online (Sandbox Code Playgroud)

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

小智 16

在1.4中你可以:

jq '..|.updateDate?'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 当结构包含数组时,这将出错。我认为在中间添加 `|object|` 可以解决这个问题。 (2认同)

Jua*_*mpa 11

接受的答案也会null为每个没有密钥的对象生成。

对我有用的是:

jq '..|objects|.updateDate//empty'
Run Code Online (Sandbox Code Playgroud)

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

false如果您希望密钥的值为或,这当然行不通null。在这种情况下,请使用:

jq '..|objects|select(has("updateDate"))|.updateDate'
Run Code Online (Sandbox Code Playgroud)