2017-03-02 1 views
1

Ich habe JSON wie folgt aus:JQ wählen dynamische Elemente aus json

{ 
    "photo_807": "Ih2RnaBTg2o.jpg", 
    "photo_604": "zodCm9fQgX8.jpg", 
    "photo_130": "4Dx-SUNKBw4.jpg", 
    "photo_75": "7COWb8ou1qA.jpg", 
    "user_id": 100, 
    "owner_id": -2435432542783750, 
    "access_key": "fc5275423676514042234324265cc3df7607c", 
    "post_id": 380435645368865101, 
    "date": 14858616848616779856424245814, 
    "text": "", 
    "height": 417, 
    "width": 740, 
    "id": 45624575446886886564368555, 
    "album_id": -36 
} 

ich nur Foto-Werte erhalten wollen, von dem Ausgang möchte ich diese:

"photo_807": "Ih2RnaBTg2o.jpg" 
"photo_604": "zodCm9fQgX8.jpg" 
"photo_130": "4Dx-SUNKBw4.jpg" 

Jetzt über mein Problem, von nächste JSON-Datei wird i foto~~POS=TRUNC mit neuen Namen wie diese:

"photo_181": "Ih2RnaBTg2o.jpg", 
    "photo_583": "zodCm9fQgX8.jpg", 
    "photo_975": "4Dx-SUNKBw4.jpg", 
    "photo_32": "7COWb8ou1qA.jpg", 

, wie ich diese Werte von den dynamischen Posten bekommen foto_ *?

Ich versuche, so etwas wie dieses:

cat ./json3.txt | jq '.response.items[].attachments[].photo | select(.photo | startswith("photo"))' 

Aber es funktioniert nicht.

Wenn ich laufen:

cat ./json3.txt | jq '.response.items[].attachments[].photo' 

ich mit allen Elementen diese Ausgabe bekommen:

{ 
    "photo_807": "Ih2RnaBTg2o.jpg", 
    "photo_604": "zodCm9fQgX8.jpg", 
    "photo_130": "4Dx-SUNKBw4.jpg", 
    "photo_75": "7COWb8ou1qA.jpg", 
    "user_id": 100, 
    "owner_id": -2435432542783750, 
    "access_key": "fc5275423676514042234324265cc3df7607c", 
    "post_id": 380435645368865101, 
    "date": 14858616848616779856424245814, 
    "text": "", 
    "height": 417, 
    "width": 740, 
    "id": 45624575446886886564368555, 
    "album_id": -36 
} 

Kann mir jemand helfen?

Vielen Dank im Voraus!

+0

Jetzt mache ich es mit grep und schrecklichen sed-Kombinationen: cat ./json3.txt | jq '.response.items []. Anhänge []. photo' | grep "Foto_" | sed 's/"//' | sed 's /": //' | sed 's/", //' | sed 's /" //' Vielleicht kann jemand es nur mit jq machen? – Darkwind

+0

Stellen Sie Ihre komplette 'JSON' aus Wurzel – Inian

Antwort

2

Sie können einen jq Filter wie folgt verwenden, wie unter jq-play getestet!

jq '. | to_entries[] | select(.key | startswith("photo")) | "\(.key) :\(.value)"' json 
"photo_807 :Ih2RnaBTg2o.jpg" 
"photo_604 :zodCm9fQgX8.jpg" 
"photo_130 :4Dx-SUNKBw4.jpg" 
"photo_75 :7COWb8ou1qA.jpg" 

Die Idee ist, die to_entries[] Einbau-zu verwenden, die konvertiert Ihre Eingabe in ein Schlüssel-Wert-Paar als unten. Siehe unten die Ausgabe von nur mit to_entries[]

jq '. | to_entries[]' json 
{ 
    "key": "photo_807", 
    "value": "Ih2RnaBTg2o.jpg" 
} 
{ 
    "key": "photo_604", 
    "value": "zodCm9fQgX8.jpg" 
} 
{ 
    "key": "photo_130", 
    "value": "4Dx-SUNKBw4.jpg" 
} 
{ 
    "key": "photo_75", 
    "value": "7COWb8ou1qA.jpg" 
} 
{ 
    "key": "user_id", 
    "value": 100 
} 
{ 
    "key": "owner_id", 
    "value": -2435432542783750 
} 
{ 
    "key": "access_key", 
    "value": "fc5275423676514042234324265cc3df7607c" 
} 
{ 
    "key": "post_id", 
    "value": 380435645368865100 
} 
{ 
    "key": "date", 
    "value": 14858616848616779000000000000 
} 
{ 
    "key": "text", 
    "value": "" 
} 
{ 
    "key": "height", 
    "value": 417 
} 
{ 
    "key": "width", 
    "value": 740 
} 
{ 
    "key": "id", 
    "value": 45624575446886885000000000 
} 
{ 
    "key": "album_id", 
    "value": -36 
} 

Auf dieser Ausgabe sind wir Filterung auf den .key Wert, der mit der Zeichenfolge beginnt, photo in Ihrem Fall mit dem eingebauten in startswith() und Druck der sowohl die .key und .value paar für die passenden Objekte.

+0

Danke Inian! Sehr interessant! Wenn ich aber command - jq '.response.items []. Attachments []. Photo | to_entries [] | Wählen Sie (.key | startswith ("Foto")) | "\ (. key): \ (. value)" './json3.txt Ich habe einen Fehler erhalten, der nicht definiert ist. Was ich falsch mache? – Darkwind

+0

Ich dachte, die Eingabe ist Ihre komplette json, bieten die komplette, von '.response.items []. Anhänge []' @Darkwind – Inian

+1

@Darkwind - Wenn Ihr jq hat nicht begonnen, es ist sehr alt. Bitte versuchen Sie es auf mindestens jq 1.4 zu aktualisieren – peak