2014年10月26日 星期日

方便好用的命令列 JSON 解析器: JQ

# JQ 一個好用的JSON解析工具
***
今天要來介紹的是一個解析 JSON 格式的工具,也許你會說「解析 JSON 有什麼好稀奇的,很多程式語言都有對應的函式庫可以解析阿,哪裡稀奇」,噹噹噹噹,事情當然不是憨人所想的這麼簡單,且聽我娓娓道來。



當然很多程式語言都可以利用函式庫的方法來解析 JSON,但是當今天你只是想看一個小文件,卻要動用程式語言不是很麻煩嗎?而且我光想到還要引入函式庫,函式庫不熟還要查一下相關的 API 怎麼用,出了問題在來看是不是有什麼限制,想到就一個頭兩個大。


這時候就要請出好用的 JQ 出馬了,原始網站連結在 http://stedolan.github.io/jq/

JQ 到底好用在哪裡呢?想想你在命令列使用 awk 或是 sed 的經驗,基本上解析 JSON 文件就是這麼簡單,輕輕鬆鬆就可以把你想要看得資料從 JSON 格式中解放出來


當你下載好了之後,看要不要 cp 放到 /usr/bin 底下,方便以後當作系統得程式使用,就不用每次都還要指定目錄,以下都當作系統已經有了 jq 直接呼叫


官方網站其實也有了範例,連結在 http://stedolan.github.io/jq/tutorial/ ,英文好得人可以直接連線過去看
jq 用法很簡單,就是利用 **.** 來取出你要得資料,以及區分層級


假如你的 JSON 檔案裡面只有一筆資料,就可以直接利用 **.** 來取值,以下使用

    curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' |jq '.[0]' > only_one.json

以 onlyone.json 來當例子,這是 github 上面的提交紀錄,今天想要知道這個紀錄的雜湊值的話,指令是

    cat only_one.json | jq '.sha'

輸出應該會像是

    "89791a000ba8fd614d8a8fa59a5ba76f21ea4d1d"

想知道這個紀錄的提交理由的,可以輸入

    cat only_one.json | jq '.commit.message'

會輸出像是

    "Add support for JSON sequence MIME type\n\nPer draft-ietf-json-text-sequence-07 (which soon will be published as an\nRFC)."

上面應該很清楚的解釋了怎麼對單一文件作存取,那如果一個 JSON 檔案裡面有很多同樣名字的欄位要一起拿出來該怎麼辦呢?
一樣拿同一個網址來解釋,只是這次先把全部的內容存下來

    curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' > multi.json

現在要看所有的提交理由跟及提交作者的話,命令就像是下面這樣

    cat multi.json | jq '.[] | {message: .commit.message, name: .commit.committer.name}'

這樣會直接列出來,並且以你所指定的標籤呈現內容,可是這樣不好給程式讀,所以可以在外面在加上一對**[]**,如果要臨時塞給程式,會比較方便一點

    jq '[.[] | {message: .commit.message, name: .commit.committer.name}]'

大致上就是這樣,如果想要知道一切更進階的用法,可以去看官方網站的 manual 這邊也會不定時再更新

沒有留言:

張貼留言