2015-01-27 10 views
77

ho questo JSONUtilizzando JQ per analizzare e visualizzare più campi in un JSON in serie

{ 
    "users": [ 
     { 
      "first": "Stevie", 
      "last": "Wonder" 
     }, 
     { 
      "first": "Michael", 
      "last": "Jackson" 
     } 
    ] 
} 

Utilizzando JQ mi piacerebbe visualizzare nome e cognome in serie. In questo modo -

Stevie Wonder 
Michael Jackson 

Questo è quanto ho ottenuto -

jq '.users[].first, .users[].last' 

ma visualizza

"Stevie" 
"Michael" 
"Wonder" 
"Jackson" 

notare i seguenti -

  1. Le doppie virgolette che ho non voglio.
  2. Il ritorno a capo che non desidero.
  3. È confuso. La mia query visualizza prima tutti i nomi e poi tutti i cognomi. Comunque, voglio la penultima, la penultima coppia.
+0

Attualmente sto usando il processore json della riga di comando chiamato jq - http://stedolan.github.io/jq/manual/ – San

risposta

115

mi consiglia di utilizzare String interpolazione:

jq '.users[] | "\(.first) \(.last)"' 

reference

+4

questo è molto meglio se i tuoi dati sono numeri – ozOli

+1

perché funziona? Dove posso trovare ulteriori informazioni sulla sintassi "\ (...)"? – spazm

+1

https://stedolan.github.io/jq/manual/#Stringinterpolation-%5C%28foo%29 –

88

È possibile utilizzare addition per concatenare le stringhe.

Le stringhe vengono aggiunte inserendo una stringa più grande.

jq '.users[] | .first + " " + .last' 
+16

Per eliminare le virgolette JSON, invocare jq con l'opzione -r, ad es. jq -r '.users [] | .first + "" + .last ' – peak

+1

+1, ma per il mio caso d'uso, sto provando a formattare due numeri sulla stessa riga.Questo approccio fallisce perché non può aggiungere "" "' a un numero. La risposta di Eric dà un risultato migliore per questo caso. – Synesso

+1

@Synesso: '(.numA | tostring) +" "+ (.numB | tostring)' dovrebbe funzionare. Oppure utilizzare invece l'interpolazione della stringa: '" \ (. NumA) \ (. NumB) "'. –

5

Mentre entrambe le risposte di cui sopra funzionano bene se il tasto, il valore sono stringhe, ho avuto una situazione per aggiungere una stringa e intero (errori JQ utilizzando le espressioni di cui sopra)

Presupposto: Per costruire un URL di seguito jSON

[email protected]>curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | jq .[0] 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 251 100 251 0  0 155k  0 --:--:-- --:--:-- --:--:-- 245k 
{ 
    "Node": "myconsul", 
    "Address": "192.168.99.103", 
    "ServiceID": "4ce41e90ede4:compassionate_wozniak:443", 
    "ServiceName": "apache-443", 
    "ServiceTags": [], 
    "ServiceAddress": "", 
    "ServicePort": 1443, 
    "ServiceEnableTagOverride": false, 
    "CreateIndex": 45, 
    "ModifyIndex": 45 
} 

Soluzione:

curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | 
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"' 
+0

nota che l'escape della parentesi di chiusura non è necessaria e errerebbe. – nymo

+0

@nymo: Non sta scappando. '\ (...)' è una stringa di interpolazione. Qui trasforma '.ServicePort' numerico in stringa. L'interpolazione potrebbe essere utilizzata al posto dei segni "+" per rendere più corta questa soluzione. –

0

ho ottenuto abbastanza vicino a quello che volevo facendo qualcosa di simile

cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | " - " + .sub_key)' | tr -d '"' 

L'uscita del quale è abbastanza vicino a YAML per me di solito importarla in altri strumenti senza molto problema. (Sto ancora cercando un modo per esportare tutto un sottoinsieme dell'input json)