2016-02-02 15 views
21

Ich versuche jq zu bekommen eine JSON-Struktur wie zu analysieren:Verwenden jq ein JSON-String zu analysieren

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

Das heißt, ein Element in der JSON ist ein String mit entkam json.

Also, ich habe etwas entlang der Linien von $ jq [.c] myFile.json | jq [.id]

Aber das stürzt mit jq: error: Cannot index string with string

Dies liegt daran, die Ausgabe von .c ein String ist, nicht mehr JSON. Wie bekomme ich jq diese Zeichenfolge zu analysieren?

Meine erste Lösung ist sed zu verwenden, um all Escape-Zeichen zu ersetzen (\":\", \",\" und \"), aber das ist chaotisch, gehe ich davon aus es eine Möglichkeit, in jq gebaut ist, dies zu tun?

Danke!

edit: Auch die jq Version verfügbar ist hier:

$ jq --version 
jq version 1.3 

Ich glaube, ich es nicht aktualisieren, falls erforderlich.

+0

Diese Frage hilft auch, wenn Sie suchen: "Wie JSON-Zeichenkette mit JQ Unescap?" – k0pernikus

Antwort

27

jq hat die fromjson builtin hierfür:

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

fromjson wurde in der Version 1.4 hinzugefügt.

+2

Danke. Das funktioniert. Ich werde diese Antwort akzeptieren, da es mehr "idiomatisch" ist, fühle ich. Prost. –

+2

Dies sollte die richtige Antwort markiert sein. –

+0

@ColinGrogan bitte tun. – vbence

18

Sie können die Rohausgangssignal verwenden (-r), die Charaktere werden unescape:

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

NACHTRAG: Dies hat den Vorteil, dass es in jq 1.3 oder höher arbeitet; Tatsächlich sollte es in jeder Version von jq mit der Option -r funktionieren.

+0

Ausgezeichnet, danke! –