Conosco "jq" per analizzare json.
Lavoro con un servizio che produce una risposta json in cui una delle proprietà è essa stessa una stringa json. Come posso convertire quel valore tra virgolette in una stringa json valida in modo da poterlo elaborare con jq?
Ad esempio, se vedo solo il semplice json piuttosto stampato da "jq.", Ecco un breve estratto dell'output:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Posso usare jq per ottenere il valore di quella proprietà, ma ho bisogno di convertire la stringa tra virgolette in json valido "annullando l'escaping" di esso.
Suppongo di poterlo convogliare in sed, rimuovendo l'apertura e la fine delle doppie virgolette e rimuovendo tutte le barre rovesciate (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
"). Sembra funzionare, ma non sembra la soluzione più solida.
Aggiornamento :
Solo per essere un po 'più chiaro su quello che sto facendo, ecco un paio di esempi elisi che mostrano ciò che ho provato:
% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...
Aggiornamento :
Ecco un esempio completamente autonomo:
% cat stuff.json | jq .
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"
Aggiornamento :
Se provassi a elaborare l'ultimo output con una vera espressione jq, fa qualcosa del genere:
% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)
echo $(jq statement here)
?
jq
per ottenere solo il valore della proprietà stringa, lo restituisce senza caratteri di escape? Se è così, basta inserirlo in un nuovojq
.