sudhishkr sudhishkr - 4 months ago 5x
JSON Question

How to use `jq` to obtain the keys

My json looks like this :

"20160522201409-jobsv1-1": {
"vmStateDisplayName": "Ready",
"servers": {
"20160522201409 jobs_v1 1": {
"serverStateDisplayName": "Ready",
"creationDate": "2016-05-22T20:14:22.000+0000",
"state": "READY",
"provisionStatus": "PENDING",
"serverRole": "ROLE",
"serverType": "SERVER",
"serverName": "20160522201409 jobs_v1 1",
"serverId": 2902
"isAdminNode": true,
"creationDate": "2016-05-22T20:14:23.000+0000",
"totalStorage": 15360,
"shapeId": "ot1",
"state": "READY",
"vmId": 4353,
"hostName": "20160522201409-jobsv1-1",
"label": "20160522201409 jobs_v1 ADMIN_SERVER 1",
"ipAddress": "",
"publicIpAddress": "",
"usageType": "ADMIN_SERVER",
"role": "ADMIN_SERVER",
"componentType": "jobs_v1"

My key keeps changing from time to time. So for example
may be something else tomorrow. Also I may more than one such entry in the json payload.

I want to
echo $KEYS
and I am trying to do it using

Things I have tried :
| jq .KEYS
is the command i use frequently.

Is there a jq command to display all the primary keys in the json?

I only care about the
field. And I would like to extract that out. I know how to do it using
but it is NOT a clean approach.


You can simply use: keys:

% jq 'keys' my.json

And to get the first:

% jq -r 'keys[0]' my.json

-r is for raw output:

--raw-output / -r: With this option, if the filter’s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.


If you want a known value below an unknown property, eg xxx.hostName:

% jq -r '.[].hostName' my.json