Ich kenne "jq" zum Parsen von json.
Ich arbeite mit einem Dienst, der eine JSON-Antwort erzeugt, wobei eine der Eigenschaften selbst eine JSON-Zeichenfolge ist. Wie konvertiere ich diesen zitierten Wert in eine gültige JSON-Zeichenfolge, damit ich ihn dann mit JQ verarbeiten kann?
Wenn ich zum Beispiel nur den einfachen, hübsch gedruckten json aus "jq." Ansehe, ist hier ein kurzer Auszug der Ausgabe:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Ich kann jq verwenden, um den Wert dieser Eigenschaft abzurufen, aber ich muss den in Anführungszeichen gesetzten String in einen gültigen json konvertieren, indem ich ihn "ausbaue".
Ich nehme an, ich könnte es in sed umleiten, die öffnenden und endenden doppelten Anführungszeichen entfernen und alle Backslashes (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
") entfernen . Das scheint zu funktionieren, aber das scheint nicht die robusteste Lösung zu sein.
Update :
Um ein bisschen klarer zu sein, was ich tue, hier ein paar Beispiele, die zeigen, was ich versucht habe:
% 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\",...
Update :
Hier ist ein völlig eigenständiges Beispiel:
% 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\"}"
Update :
Wenn ich versucht habe, diese letzte Ausgabe mit einem echten jq-Ausdruck zu verarbeiten, geschieht Folgendes:
% 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)
jq
, um nur den Wert der Zeichenfolge-Eigenschaft abzurufen, wird er dann ohne Flucht zurückgegeben? Wenn ja, leiten Sie das einfach in ein frischesjq
.echo $(jq statement here)
?Antworten:
Dafür gibt es eine
raw
FlaggeAusgabe
quelle
jq
Für die weitere JSON-Verarbeitung müssen Sie eine Pipeline an eine andere senden, wohingegen Sie mit dem Ansatz von Roman denselbenjq
Ausdruck fortsetzen können.jq -rc '.stuff.date'
produziertjq: error (at <stdin>:0): Cannot index string with string "date"
. Allerdings:.stuff | fromjson | .date
funktioniert gut.Mit
jq
'sfromjson
Funktion:Beispielinhalt
stuff.json
:Die Ausgabe:
quelle