Usa jq per analizzare una stringa JSON


87

Sto cercando di jqanalizzare una struttura JSON come:

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

Ovvero, un elemento in JSON è una stringa con json con escape.

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

Ma questo va in crash con jq: error: Cannot index string with string

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

La mia soluzione iniziale è quello di usare sed per sostituire tutti i caratteri di fuga ( \":\", \",\"e \"), ma che di disordinato, presumo ci sia un modo integrato in jqper fare questo?

Grazie!

modifica: Inoltre, la versione jq disponibile qui è:

$ jq --version
jq version 1.3

Immagino di poterlo aggiornare se necessario.


Questa domanda aiuta anche se stai cercando: "Come annullare l'escape di una stringa json usando jq?"
k0pernikus

Risposte:


164

jq ha il fromjsonbuiltin per questo:

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

fromjson è stato aggiunto nella versione 1.4.


2
Grazie. Funziona. Accetterò questa risposta, poiché è più "idiomaita" che penso. Saluti.
Colin Grogan

@ColinGrogan per favore fallo.
vbence

@ColinGrogan: non vedo alcun motivo per modificare la risposta accettata poiché hai chiaramente scritto nella tua domanda che hai utilizzato la versione 1.3 di jq in cui la fromjsonfunzionalità non è disponibile. In altre parole, anche se questa risposta è interessante, non risponde alla domanda.
Casimir et Hippolyte

È possibile usarlo ma su un intero file json (senza specificare la proprietà .id)?
Florian Castelain

1
@FlorianCastelain sì, omettilo o usa il punto jq 'fromjson | .' myfile"{\"key\":1, \"word\":\"cat\"}"

41

Puoi usare l'output non elaborato (-r) che eliminerà i caratteri:

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

ADDENDUM: ha il vantaggio di funzionare in jq 1.3 e versioni successive; anzi, dovrebbe funzionare in ogni versione di jq che ha l'opzione -r.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.