javascript
c json 数组转dirction_值得掌握的命令行JSON工具jq
我們都知道現(xiàn)在JSON是最常用的配置和數(shù)據(jù)交換格式之一,尤其是大量的系統(tǒng)API接口現(xiàn)在基本上都是以JSON格式顯示結(jié)果。JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。JSON獨(dú)立于語言的文本格式,具有典型的使C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等),JSON易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。
各種語言都有大量的JSON處理庫,比如fastjson,Json-lib,jsoniter,jackson,gson等,我們可以很方便就可以寫一個(gè)腳本獲取接口的Json信息,并通過這些類庫進(jìn)行處理。
雖然如此,有些同學(xué)可能還是嫌寫腳本太麻煩,有沒有一種很簡單就能上手就用,用完就扔的JSON工具呢?答案是肯定的。這就是本文蟲蟲要給大家介紹的一個(gè)命令行工具jq,注意jq不是曾經(jīng)流行的JS庫Jquery的縮寫。
jq是一個(gè)出色的命令行JSON處理器,提供了用于查詢,操作和使用JSON文件的大量功能。而且作為一個(gè)命令行工具,可配合UNIX管道使用,單行腳本處理JSON。
安裝
jq是開源跨平臺(tái)的軟件,支持Linx,Mac OS和Windows,可通過應(yīng)用包管理器、源碼形式安裝。
包管理安裝
Debian和Ubuntu系:sudo apt-get install jq
redhat系:sudo yum install jq 或 sudo dnf install jq
openSUSE:sudo zypper install jq
Arch:sudo pacman -Sy jq
Mac OS:使用Homebrew安裝,brew install jq
Windows:使用Chocolatey NuGet或者直接下載官方二進(jìn)制包
chocolatey install jq
源碼安裝
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install
jq快速入門
為了方便以一個(gè)簡單例子開始。首先我們調(diào)用GitHub的API,獲取一個(gè)倉庫的commit歷史,并將其保存為example.json文件。
curl -o example.json 'https://api.github.com/repos/bollwarm/SecToolSet/commits'
要查看json內(nèi)容最簡單的是使用.表達(dá)式,會(huì)打印json的原始內(nèi)容。
jq '.' example.json
json文件中的commit信息都是一個(gè)數(shù)組,其中一個(gè)commit可以使用.[x]操作,這和各個(gè)語言的數(shù)組操作也一樣。比如:
第一個(gè)commit為.[0],以零開頭。
jq '.[0]' example.json
| 操作符號(hào)是jq中的過濾器,過濾格式通過{...}來構(gòu)建對(duì)象和屬性,可以嵌套訪問屬性,例如.commit.message
下面語句獲取第一個(gè)commit消息的commit.message和commit.committer.name并顯示message和name:
jq '.[0] | {message: .commit.message, name: .commit.committer.name}' example.json
[]中如果為空表示獲取所有的數(shù)組元素,獲取所有commit消息和提交者:
jq '.[] | {message: .commit.message, name: .commit.committer.name}' example.json
jq中的數(shù)據(jù)表示為JSON流:每個(gè)jq表達(dá)式對(duì)JSON流中的各個(gè)值操作,其輸出流可也包含任意數(shù)量的值。
通過僅用空格分隔JSON值即可對(duì)流進(jìn)行序列化。這是cat顯示友好的格式。如果想要將結(jié)果要輸出作為數(shù)組形式的json格式,可以通過將過濾器用[]括住:
jq '[.[] | {message: .commit.message, name: .commit.committer.name}]' example.json
如果要獲取一個(gè)commit的多個(gè)父提交的URL,由于該字段為多個(gè)元素以數(shù)組形式顯示,如果直接使用.parents.html_url過濾則會(huì)下面的報(bào)錯(cuò):
jq: error (at example.json:2268): Cannot index array with string "html_url"
對(duì)該類字段過濾時(shí)候,需要使用[.parents[].html_url]的數(shù)組解析格式:
jq '[.[] | {message: .commit.message, name: .commit.committer.name, parents: [.parents[].html_url]}]' example.json
管道
我們?cè)谌腴T部分介紹了jq的基本使用和顯示。jq作為了一個(gè)標(biāo)準(zhǔn)的shell命令行工具,也是遵循UNIX POSIX原則的,比如管道。可以通過管道對(duì)接jq的數(shù)據(jù)輸入和輸出,這樣可以jq實(shí)現(xiàn)和其他工具進(jìn)行交互非常。下面的管道中,cat將文件通過管道傳輸?shù)絡(luò)q,然后通過管道傳輸?shù)絣ess管道。這對(duì)于查看大型JSON文件非常有用。
cat example.json | jq '.' | less
當(dāng)然用管道對(duì)接less著色就失效了,這是一個(gè)副作用。
對(duì)鍵和值過濾
為了找到鍵和值,jq可以根據(jù)鍵進(jìn)行過濾并返回值。入門部分我們已經(jīng)講了過濾鍵。我們?cè)倥e一個(gè)簡單例子,假設(shè)一個(gè)如下的JSON文檔保存為dog.json。
jq可以通過在表達(dá)式中使用.鍵名來搜索值。
jq '.name' dog.json
CC
多個(gè)鍵搜索,中間用逗號(hào)分開:
jq '.breed,.name' dog.json
"金毛"
"CC"
可以將鍵名自定義:
jq '{"主人":.owner,"愛好":.likes}' dog.json
數(shù)組遍歷和查詢
入門部分我們說過,要搜索數(shù)組中的項(xiàng)目,請(qǐng)使用括號(hào)語法,索引從0開始。
jq '.likes[1]' dog.json
"球球"
數(shù)組的多個(gè)元素也可能返回。
echo '["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",",","!"]'|jq '[.[12],.[4],.[17],.[17],.[24],.[26],.[2],.[7],.[17],.[8],.[18],.[19],.[12],.[0],.[18],.[27]]
結(jié)果:" MERRY,CHRISTMAS!" 祝大家圣誕快樂!
數(shù)據(jù)轉(zhuǎn)換
jq不僅可以用于從JSON對(duì)象獲取值顯示,而且還可以用于JSON轉(zhuǎn)換為新的數(shù)據(jù)結(jié)構(gòu)。比如:對(duì)dog.json 可以創(chuàng)建一個(gè)包含狗名和愛好的鍵,組成一個(gè)新數(shù)組。
jq '[.name,.likes[]]' dog.json
[
"CC",
"骨頭",
"球球",
"狗糧"
]
需要把JSON數(shù)據(jù)從一種結(jié)構(gòu)轉(zhuǎn)移到另一種數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換時(shí),非常有用。
jq還可以對(duì)JSON對(duì)象中的數(shù)據(jù)進(jìn)行操作。
echo '{"a": 1 , "b": 2}'|jq '.a+100'
101
其實(shí)上,+對(duì)字符串也是適用的,比如前面的圣誕快樂單行也可以為:
echo '["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",",","!"]'|jq '[.[12]+.[4]+.[17]+.[17]+.[24]+.[26]+.[2]+.[7]+.[17]+.[8]+.[18]+.[19]+.[12]+.[0]+.[18]+.[27]]'
結(jié)果:
[
"MERRY,CHRISTMAS!"
]
刪除JSON鍵
jq也支持從JSON對(duì)象中刪除鍵。刪除后輸出就不包含刪除key的JSON對(duì)象。刪除鍵使用del()函數(shù),還是以dog.json為例:
jq 'del(.owner)' dog.json
結(jié)果中就不包括owner鍵了:
{
"name": "CC",
"breed": "金毛",
"age": "4",
"likes": [
"骨頭",
"球球",
"狗糧"
]
}
jq 'del(.)' dog.json
null
所有鍵都被刪了,所以上面結(jié)果為null。
值映射
jq可以映射值并在每個(gè)值上執(zhí)行操作。在下面的示例中,數(shù)組中的每個(gè)鍵進(jìn)行映射并做數(shù)值計(jì)算加2。
echo '[1,2,3,4,5,6]' |jq 'map(.+2)'
[
3,
4,
5,
6,
7,
8
]
總結(jié)
本文介紹了一個(gè)命令行下的json解析神器,更多文檔可以參考官方網(wǎng)站,可以托管倉庫的wiki頁。
總結(jié)
以上是生活随笔為你收集整理的c json 数组转dirction_值得掌握的命令行JSON工具jq的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring日志报错提醒_Spring
- 下一篇: 的工作空间查看_【工作推荐】裱花师、现金