2015-03-03 9 views
5

Sono nuovo di JQ e affrontare un problema durante l'analisi mia JSONOttenere dati da JSON utilizzando JQ quando la chiave è la stringa numerica

Ho un JSON memorizzato in una variabile come questo

temp='{ "1": { "my_name": "one" }, "2": { "my_name": "two" } }' 

Ora necessario per ottenere il valore di my_name per entrambe le altre voci

ho provato qualcosa di simile

echo $temp | jq '.1' //out put 0.1 
I was assuming to get { "my_name": "one" } 

E allo stesso modo per ottenere il valore my_name ho fatto

echo $temp | jq '.1.my_name' // Its output is giving me error 

qualcuno può per favore aiutare a identificare ciò che è sbagliato con la mia sintassi e come posso correggerlo.

Grazie

+2

prega modifica la tua domanda per includere il comando esatto e il messaggio di errore che stai ricevendo. Inoltre, ho una programmazione di shell, è una buona regola pratica per citare qualsiasi uso di variabili (eccetto per pochissimi casi speciali). 'echo" $ temp "| ... 'potrebbe aiutare. In bocca al lupo. – shellter

+0

Ciao @shellter che lo avvolge attorno alle virgolette continua a dare lo stesso risultato. – user2243651

+0

il mio commento su "echo" $ temp "' vuole essere un consiglio generale. Non volevo dire che avrebbe risolto il tuo problema. Credo che l'upvote '1' per il mio commento sia per la mia richiesta di modificare la tua domanda per includere il comando esatto che stai eseguendo E il testo esatto del messaggio di errore che stai ricevendo. In bocca al lupo. – shellter

risposta

5

Solo il numero ottiene interpretati come un galleggiante. È necessario utilizzarlo in un contesto in cui è inequivocabilmente una stringa di chiavi.

echo "$temp" | jq '.["1"]["my_name"]' 

e

echo "$temp" | jq '.["1"]' 

per ottenere il dict contiene.

Con una nuova sufficientemente jq (credo> = 1.4) si può anche dire

echo "$temp" | jq '."1".my_name' 
1

Ogni volta che si sta tentando di fare riferimento a una chiave che non è un identificatore valido, è necessario citarlo. Vedi lo manual per maggiori dettagli.

per selezionare la voce sotto la chiave 1, faresti questo:

."1" 

Per la vostra altra domanda su come ottenere i valori my_name, si potrebbe fare questo:

to_entries | map(.value.my_name) 
Problemi correlati