2017-03-02 75 views
1

動態的項目我有JSON是這樣的:JQ選擇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 
} 

我想只有照片值,從輸出我想要得到這樣的:

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

現在關於我的問題,從下一個JSON文件我會得到像這樣的新名稱的照片項目:

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

我如何能從動態項目獲取此值photo_ *?

我嘗試這樣:

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

但它不工作。

當我運行:

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

我得到這個輸出,所有項目:

{ 
    "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 
} 

有人能幫助我嗎?

在此先感謝!

+0

現在我用grep和可怕的sed組合來做它:cat ./json3.txt | jq'.response.items []。attachments []。photo'| grep「photo_」| sed's /「//'| sed's /」://'| sed's /「,//'| sed's /」//'也許有人知道如何用jq做到這一點? – Darkwind

+0

從根提供完整的'JSON' – Inian

回答

2

您可以使用jq過濾器,如在jq-play上測試的那樣!

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" 

的想法是使用to_entries[]內置,它下面的輸入轉換成鍵值對。看到的只是使用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 
} 

在此輸出的輸出下面,我們正在篩選上.key值與你的字符串,photo你的情況開始,利用內置的startswith(),和打印兩個.key.value對匹配的對象。

+0

謝謝Inian!非常有趣!但是當我運行命令 - jq'.response.items []。attachments []。photo | to_entries [] |選擇(.key | startswith(「photo」))| 「\(.key):\(.value)」'./json3.txt我得到錯誤startswith沒有定義。我做錯了什麼? – Darkwind

+0

我認爲提供的輸入是你的完整的json,提供完整的,從'.response.items []。附件[]'@Darkwind – Inian

+1

@Dwindwind - 如果你的jq沒有startswith,它是非常古老的。請嘗試升級到至少jq 1.4 – peak