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:

"madireddy@test.com"

"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

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"

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"

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;

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"

4

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

ab
cd

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"

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'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.