2016-02-02 55 views
21

Sto cercando di ottenere jq per analizzare una struttura JSON come:Usa JQ ad analizzare una stringa JSON

{ 
    "a" : 1, 
    "b" : 2, 
    "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n" 
} 

Cioè, un elemento in JSON è una stringa con JSON sfuggito.

Così, ho qualcosa sulla falsariga di $ jq [.c] myFile.json | jq [.id]

Ma che si blocca con jq: error: Cannot index string with string

Questo perché l'uscita di .c è una stringa, non di più JSON. Come posso ottenere jq per analizzare questa stringa?

La mia soluzione iniziale è quello di utilizzare sed per sostituire tutti i caratteri di escape (\":\", \",\" e \") ma questo è disordinato, suppongo ci sia un modo integrato in jq per fare questo?

Grazie!

edit: Inoltre, la versione JQ disponibile qui è:

$ jq --version 
jq version 1.3 

Credo che avrei potuto aggiornarlo, se necessario.

+0

Questa domanda è utile anche se si sta cercando: "Come rimuovere la stringa json utilizzando jq?" – k0pernikus

risposta

27

JQ ha incorporato fromjson per questo:

jq '.c | fromjson | .id' myFile.json 

fromjson è stato aggiunto nella versione 1.4.

+2

Grazie. Questo funziona. Accetterò questa risposta, poiché è più "idiomaitica" che sento. Cheers. –

+2

Dovrebbe essere contrassegnata la risposta corretta. –

+0

@ColinGrogan si prega di fare. – vbence

18

È possibile utilizzare l'uscita prima (-r) che unescape personaggi:

jq -r .c myfile.json | jq .id 

APPENDICE: Questo ha il vantaggio che funziona in JQ 1.3 e fino; in effetti, dovrebbe funzionare in ogni versione di jq che ha l'opzione -r.

+0

Eccellente, grazie! –