如何使用jq从JSON中获取键名

256

curl http://testhost.test.com:8080/application/app/version | jq '.version' | jq '.[]'

上面的命令只会输出如下数值:

"madireddy@test.com"

"2323"

"test"

"02-03-2014-13:41"

"application"

我该如何获取以下类似的关键字名称:

email

versionID

context

date

versionName
9个回答

370

要按照原始JSON中出现的顺序获取键,请使用:

jq 'keys_unsorted' file.json

如果您想按字母数字顺序排序密钥,可以使用:

jq 'keys' file.json

完整示例

$ cat file.json
{ "Created-By" : "Apache Maven", "Build-Number" : "", "Archiver-Version" : "Plexus Archiver", "Build-Id" : "",  "Build-Tag" : "", "Built-By" : "cporter"}

$ jq 'keys_unsorted' file.json                                         
[
  "Created-By",
  "Build-Number",
  "Archiver-Version",
  "Build-Id",
  "Build-Tag",
  "Built-By"
]

$ jq 'keys' file.json
[
  "Archiver-Version",
  "Build-Id",
  "Build-Number",
  "Build-Tag",
  "Built-By",
  "Created-By"
]

1
我会将答案更正为 jq 'keys | sort' … 以获得更好的可读性。 - AnrDaemon
请注意,jq 'keys' 在输出键之前会对其进行排序,这可能不符合用户的预期。 - Cornelius Roemer
1
@AnrDaemon 'keys'默认已经排序。如果需要未排序的结果(这正是我所需的),请使用'keys_unsorted' - Cornelius Roemer
1
@CorneliusRoemer 非常感谢您指出这一点并编辑回答。 - anubhava
1
@CorneliusRoemer非常感谢您指出这一点。我第一眼没有注意到。 - AnrDaemon
显示剩余2条评论

80
获取 JSON 中更深层次节点的键:

要获取 JSON 中更深层次节点的键:

echo '{"data": "1", "user": { "name": 2, "phone": 3 } }' | jq '.user | keys[]'
"name"
"phone"

4
这个答案比被采纳的答案稍微好一点,因为它展示了如何在 jq 表达式中使用 |,而不是通过几个 jq 实例将输出进行管道连接。 - tschaible

43

你需要使用jq 'keys[]'。例如:

echo '{"example1" : 1, "example2" : 2, "example3" : 3}' | jq 'keys[]'

将输出一个每行分隔的列表:

"example1"
"example2"
"example3"

20

结合上面的回答,您想要请求 jq 输出原始结果,因此您的最后一个过滤器应该是:

     cat input.json | jq -r 'keys'

来自 jq 帮助文档:

     -r     output raw strings, not JSON texts;

14

如果您的输入是一个对象数组,

[
  { 
    "a01" : { "name" : "A", "user" : "B" }
  },
  { 
    "a02" : { "name" : "C", "user" : "D" }
  }
]

尝试使用:

jq '.[] | keys[]'

11

将键以CSV格式打印在同一行上:

echo '{"b":"2","a":"1"}' | jq -r 'keys | [ .[] | tostring ] | @csv'

输出:

"a","b"

为了完整性考虑,将值作为csv格式在一行上打印:

echo '{"b":"2","a":"1"}' | jq -rS . | jq -r '. | [ .[] | tostring ] | @csv'

输出:

"1","2"

11

有趣的是,被接受的答案实际上并没有确切回答这个问题,所以作为参考,这里提供一个真正解决问题的解决方案:

$ jq -r 'keys_unsorted[]' file.json

2
这是唯一一个对我有效的方法。我在这个问题上花了超过6个小时。谢谢!您还可以使用JSON变量,如下所示:declare -a MASTER_KEYS_LIST=($(jq -r 'keys_unsorted[]' <<< "${JSON_OBJECT_VAR}")) - Jeremy
是的,这是唯一一个不改变键顺序的选项。虽然 [] 看起来似乎是不必要的。对我来说,这个命令很有效:jq 'keys_unsorted' file.json - Cornelius Roemer
@peak 感谢您提供这个正确的解决方案,我编辑了被接受的答案以添加 keys_unsorted 并展示了示例数据的差异(OP使用了排序后的键,这掩盖了键和未排序的键之间的差异)。 - Cornelius Roemer

7

echo '{"ab": 1, "cd": 2}' | jq -r 'keys[]' 命令可以将所有的键一行一个输出,不带引号。

ab
cd

2

以下是通过 @anubhava 答案中提供的示例 JSON 获取 Bash 数组的另一种途径:

arr=($(jq --raw-output 'keys_unsorted | @sh' file.json))

echo ${arr[0]}    # 'Archiver-Version'
echo ${arr[1]}    # 'Build-Id'
echo ${arr[2]}    # 'Build-Jdk'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接