Ich versuche, jq
eine JSON-Struktur wie folgt zu analysieren:
{
"a" : 1,
"b" : 2,
"c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}
Das heißt, ein Element im JSON ist eine Zeichenfolge mit maskiertem json.
Also habe ich etwas in der Art von
$ jq [.c] myFile.json | jq [.id]
Aber das stürzt mit ab jq: error: Cannot index string with string
Dies liegt daran, dass die Ausgabe von .c eine Zeichenfolge ist, nicht mehr JSON. Wie bringe ich jq dazu, diesen String zu analysieren?
Meine anfängliche Lösung besteht darin, sed zu verwenden, um alle Escape-Zeichen ( \":\"
, \",\"
und \"
) zu ersetzen , aber das ist chaotisch. Ich nehme an, es gibt einen eingebauten Weg jq
, um dies zu tun.
Vielen Dank!
edit: Die hier verfügbare jq-Version ist außerdem:
$ jq --version
jq version 1.3
Ich denke, ich könnte es bei Bedarf aktualisieren.
Antworten:
jq hat das
fromjson
eingebaute dafür:jq '.c | fromjson | .id' myFile.json
fromjson
wurde in Version 1.4 hinzugefügt.quelle
fromjson
Funktion nicht verfügbar ist. Mit anderen Worten, selbst wenn diese Antwort interessant ist, beantwortet sie die Frage nicht.jq 'fromjson | .' myfile
:, wo myfile enthält"{\"key\":1, \"word\":\"cat\"}"
Sie können die Rohausgabe (-r) verwenden, mit der Zeichen entfernt werden:
jq -r .c myfile.json | jq .id
ADDENDUM: Dies hat den Vorteil, dass es in jq 1.3 und höher funktioniert; In der Tat sollte es in jeder Version von jq funktionieren, die die Option -r hat.
quelle