我試圖在使用jq的shell腳本程序中解析json文件。使用JQ在shell腳本中迭代JSON對象
的JSON結構看起來是這樣的:
{
"items":[
{
"playlists":[
{
"title":"Level One Title",
"courses":[
{
"title":"Level One Course One Title",
"lessons":[
{
"title":"lesson 1 title",
"url":"lesson 1 url"
},
{
"title":"lesson 2 title",
"url":"lesson 2 url"
}
]
},
{
"title":"Level One Course Two Title",
"lessons":[
{
"title":"lesson 1 title",
"url":"lesson 1 url"
},
{
"title":"lesson 2 title",
"url":"lesson 2 url"
}
]
}
]
},
{
"title":"Level Two Title",
"courses":[
{
"title":"Level Two Course One Title",
"lessons":[
{
"title":"lesson 1 title",
"url":"lesson 1 url"
},
{
"title":"lesson 2 title",
"url":"lesson 2 url"
}
]
},
{
"title":"Level Two Course Two Title",
"lessons":[
{
"title":"lesson 1 title",
"url":"lesson 1 url"
},
{
"title":"lesson 2 title",
"url":"lesson 2 url"
}
]
}
]
}
]
}
]
}
因爲我是一名iOS開發者,我寫了一個模擬件的雨燕代碼會達到我想要的。它看起來像這樣:
for level in levels {
let title = level["title"]
//TODO: create a folder with title and set as pwd
for course in level["courses"] {
let courseTitle = course["title"]
//TODO: create a folder with title and set as pwd
for lesson in course["lessons"] {
let title = lesson["title"]
let videoURL = lesson["url"]
//TODO: download video in current folder with title
}
}
}
levels
是Dictionaries
的Array
,level
是那些Dictionaries
之一。每個級別包含Array
的courses
,其中每個是Dictionary
,包含Array
的lesson
字典。
來自Swift,我發現jq的語法非常混亂,尤其是將函數返回值賦值給變量。這裏是我得到多遠:
levels=$(jq ".items[0].playlists" data.json)
for level in $levels
do
title=$($level | jq ".title")
echo $title
done
這似乎並沒有工作。我想我的邏輯使用for循環在這裏是完全錯誤的。任何想法如何完成?
提供樣本輸入和樣本輸出會很有幫助,所以人們不需要通讀您的代碼。另外,還有很難從代碼中得出的上下文(例如,頂級'levels'是一個列表還是一個字典?) –
順便說一句,你應該只用一個程序調用'jq'一次做所有的迭代 - 也就是說循環應該在jq代碼中,而不是shell腳本。 –
(和'在$ levels中的水平'是bug的殼 - 見http://mywiki.wooledge.org/DontReadLinesWithFor) –