Cómo obtener nombres clave de JSON usando jq

128

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

El comando anterior solo muestra los valores a continuación:

"[email protected]"

"2323"

"test"

"02-03-2014-13:41"

"application"

¿Cómo puedo obtener los nombres de las teclas como las siguientes?

email

versionID

context

date

versionName
Ezhilan Mahalingam
fuente
Me gusta esto . Anubhava..version: {"Archiver-Version": "Plexus Archiver", "Build-Id": "", "Build-Jdk": "1.7.0_07", "Build-Number": "", "Build- Etiqueta ":" "," Built-By ":" cporter "," Created-By ":" Apache Maven "," Implementation-Title ":" northstar "," Implementation-Vendor-Id ":“ com.test. testPack "," Implementation-Version ":" testBox "," Manifest-Version ":" 1.0 "," appname ":" testApp "," build-date ":" 02-03-2014-13: 41 "," versión ":" testBox ",
¿Puede agregar los datos de ejemplo que salen de la API y a los que se ingresa jq?
Carl G

Respuestas:

182

Puedes usar:

$ jq 'keys' file.json
$ cat file.json:
{ "Archiver-Version" : "Plexus Archiver", "Build-Id" : "", "Build-Jdk" : "1.7.0_07", "Build-Number" : "", "Build-Tag" : "", "Built-By" : "cporter", "Created-By" : "Apache Maven", "Implementation-Title" : "northstar", "Implementation-Vendor-Id" : "com.test.testPack", "Implementation-Version" : "testBox", "Manifest-Version" : "1.0", "appname" : "testApp", "build-date" : "02-03-2014-13:41", "version" : "testBox" }

$ jq 'keys' file.json
[
  "Archiver-Version",
  "Build-Id",
  "Build-Jdk",
  "Build-Number",
  "Build-Tag",
  "Built-By",
  "Created-By",
  "Implementation-Title",
  "Implementation-Vendor-Id",
  "Implementation-Version",
  "Manifest-Version",
  "appname",
  "build-date",
  "version"
]

ACTUALIZACIÓN: Para crear una matriz BASH usando estas teclas:

Usando BASH 4+:

mapfile -t arr < <(jq -r 'keys[]' ms.json)

En BASH más antiguo puedes hacer:

arr=()
while IFS='' read -r line; do
   arr+=("$line")
done < <(jq 'keys[]' ms.json)

Luego imprímalo:

printf "%s\n" ${arr[@]}

"Archiver-Version"
"Build-Id"
"Build-Jdk"
"Build-Number"
"Build-Tag"
"Built-By"
"Created-By"
"Implementation-Title"
"Implementation-Vendor-Id"
"Implementation-Version"
"Manifest-Version"
"appname"
"build-date"
"version"
anubhava
fuente
Gracias funcionó! Estoy asignando estos valores a la matriz en el script de Shell como array = ($ keyContents) pero no se está asignando correctamente. ¿Hay alguna forma de asignar valores a las matrices que mencionan delimitadores?
Ezhilan Mahalingam
Cada vez que la clave / valor tiene espacio, la matriz lo trata como un nuevo valor, reemplacé los espacios con _, lo que resolvió el problema. ¡Muchas gracias! Pero ahora un problema más. : (Recibo diferentes pedidos cuando obtengo claves solo y cuando obtengo valores solo: (
Ezhilan Mahalingam
2
Use en mapfile -t arr < <(jq -r 'keys[]' ms.json)lugar de esa sustitución de proceso feo para evitar tener problemas con los espacios en las teclas.
Niklas Holm
1
@anubhava, si mapfile no está disponible, un buen viejo arr=(); while IFS='' read -r line; do arr+=("$line"); done < <(...)también lo hará.
Niklas Holm
2
Es posible que desee mencionar keys_unsortedpara obtener las claves en orden de documentos.
Jeff Mercado
30

Necesitas usar jq 'keys[]'. Por ejemplo:

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

Producirá una lista separada por líneas:

"example1"
"example2"
"example3"
Chris Stryczynski
fuente
10

En combinación con la respuesta anterior, desea solicitar a jq la salida sin formato, por lo que su último filtro debería ser, por ejemplo:

     cat input.json | jq -r 'keys'

De jq help:

     -r     output raw strings, not JSON texts;
Elliot Pahl
fuente
Este es un bashguión complicado : si no especificas -r, obtienes una cadena entre comillas, que se ve bien en la pantalla, pero generalmente no quieres que las comillas estén incrustadas en la cadena.
MarkHu
44
Uso inútil del gato
0andriy
5

Para imprimir claves en una línea como csv:

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

Salida:

"a","b"

Para completar CSV ... para imprimir valores en una línea como CSV:

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

Salida:

"1","2"
nrb
fuente
4

echo '{"ab": 1, "cd": 2}' | jq -r 'keys[]' imprime todas las teclas una tecla por línea sin comillas.

ab
cd
hrushikesh
fuente
3

Para obtener las claves en un nodo más profundo en un JSON:

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

Aquí hay otra forma de obtener una matriz Bash con el ejemplo JSON dado por @anubhava en su respuesta:

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
fuente