日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

c json 数组转dirction_值得掌握的命令行JSON工具jq

發(fā)布時(shí)間:2025/4/16 javascript 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c json 数组转dirction_值得掌握的命令行JSON工具jq 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們都知道現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。