Ezhilan Mahalingam
Ezhilan Mahalingam

Reputation: 3340

How to get key names from JSON using jq

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

The above command outputs only the values as below:

"[email protected]"

"2323"

"test"

"02-03-2014-13:41"

"application"

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

email

versionID

context

date

versionName

Upvotes: 297

Views: 331860

Answers (9)

Ron Martinez
Ron Martinez

Reputation: 195

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'

Upvotes: 2

anubhava
anubhava

Reputation: 786031

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"
]

Upvotes: 425

peak
peak

Reputation: 116967

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

Upvotes: 13

freedev
freedev

Reputation: 30197

If your input is an array of objects,

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

try with:

jq '.[] | keys[]'

Upvotes: 15

Gianfranco P
Gianfranco P

Reputation: 10814

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

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

Upvotes: 103

nrb
nrb

Reputation: 312

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"

Upvotes: 11

hrushikesh
hrushikesh

Reputation: 317

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

ab
cd

Upvotes: 8

Chris Stryczynski
Chris Stryczynski

Reputation: 34061

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"

Upvotes: 49

Elliot Pahl
Elliot Pahl

Reputation: 211

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;

Upvotes: 21

Related Questions