248

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

The above command outputs only the values as below:

"madireddy@test.com"

"2323"

"test"

"02-03-2014-13:41"

"application"

How can I get the key names instead like the below:

email

versionID

context

date

versionName
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
Ezhilan Mahalingam
  • 2,838
  • 3
  • 16
  • 16

9 Answers9

359

To get the keys in the order they appear in the original JSON use:

jq 'keys_unsorted' file.json

If you want the keys sorted alphanumerically, you can use:

jq 'keys' file.json

Complete example

$ 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"
]
Cornelius Roemer
  • 3,772
  • 1
  • 24
  • 55
anubhava
  • 761,203
  • 64
  • 569
  • 643
77

To get the keys on a deeper node in a JSON:

echo '{"data": "1", "user": { "name": 2, "phone": 3 } }' | jq '.user | keys[]'
"name"
"phone"
Gianfranco P.
  • 10,049
  • 6
  • 51
  • 68
  • 4
    This one is a bit better than the accepted answer, as it demonstrates how to use | within a jq expression, rather than piping output through several instances of jq – tschaible Oct 11 '21 at 13:07
43

You need to use jq 'keys[]'. For example:

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

Will output a line separated list:

"example1"
"example2"
"example3"
Chris Stryczynski
  • 30,145
  • 48
  • 175
  • 286
18

In combination with the above answer, you want to ask jq for raw output, so your last filter should be eg.:

     cat input.json | jq -r 'keys'

From jq help:

     -r     output raw strings, not JSON texts;
Elliot Pahl
  • 181
  • 1
  • 3
13

If your input is an array of objects,

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

try with:

jq '.[] | keys[]'
freedev
  • 25,946
  • 8
  • 108
  • 125
11

To print keys on one line as csv:

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

Output:

"a","b"

For csv completeness ... to print values on one line as csv:

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

Output:

"1","2"
nrb
  • 312
  • 2
  • 5
10

Oddly enough, the accepted answer doesn’t actually answer the Q exactly, so for reference, here is a solution that does:

$ jq -r 'keys_unsorted[]' file.json
peak
  • 105,803
  • 17
  • 152
  • 177
  • 2
    This is the only one that worked for me. I spend over 6 hours just on this issue. Thank you! You can also use a JSON varaible too using: `declare -a MASTER_KEYS_LIST=($(jq -r 'keys_unsorted[]' <<< "${JSON_OBJECT_VAR}"))` – Jeremy May 22 '22 at 14:53
  • Yep, this is the only one that doesn't change the order of your keys. Though the `[]` seems unnecessary. This works for me `jq 'keys_unsorted' file.json` – Cornelius Roemer Feb 07 '23 at 19:05
  • @peak thanks for this proper solution, I edited the accepted answer to add `keys_unsorted` and made the example data show the difference (OP used sorted keys which hid the difference between keys and keys_unsorted) – Cornelius Roemer Feb 07 '23 at 19:18
6

echo '{"ab": 1, "cd": 2}' | jq -r 'keys[]' prints all keys one key per line without quotes.

ab
cd
hrushikesh
  • 177
  • 1
  • 8
2

Here's another way of getting a Bash array with the example JSON given by @anubhava in his answer:

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

echo ${arr[0]}    # 'Archiver-Version'
echo ${arr[1]}    # 'Build-Id'
echo ${arr[2]}    # 'Build-Jdk'
Ron Martinez
  • 195
  • 4
  • 7