處理JSON最強(qiáng)命令jq使用場(chǎng)景
史上最全jq命令使用詳解
一. 前言
本文價(jià)值千金, 閱讀前請(qǐng)先收藏.
jq命令
是處理json字符串的神器, 主要用于獲取JSON屬性/簡(jiǎn)單重組JSON字符串.
本章將詳細(xì)介紹jq的主要應(yīng)用場(chǎng)景, 幫助大家在平時(shí)工作中處理JSON的效率大大提升.
二. 語(yǔ)法
jq本身有一套完整語(yǔ)法,如要詳細(xì)掌握參考另外一篇總結(jié) jq詳細(xì)語(yǔ)法參考
1. 使用語(yǔ)法
jq 表達(dá)式 處理源
處理源
可以為文件路徑或管道: 讀取后必須為JSON對(duì)象
, JSON數(shù)組
, JSON對(duì)象流
三類(lèi)
2. 概念理解
JSON對(duì)象
以{
開(kāi)頭, 以}
結(jié)尾的JSON字符串, 形如{}
示例:
{ "productId": "2048200008352211", "productName": "COACH蔻馳佩利系列 馬車(chē)標(biāo)識(shí)米蘭編織鏈?zhǔn)⒈? }
JSON數(shù)組
以[
開(kāi)頭, 以]
結(jié)尾的JSON字符串, 元素間用,
分隔包括基本數(shù)組和JSON對(duì)象數(shù)組, 形如[{},{},{}]
基本數(shù)組: 元素為基本數(shù)據(jù)類(lèi)型, 如[1,2,3,5], [“shanghai”, “guangzhou”,“beijing”]JSON對(duì)象數(shù)組: 元素為JSON對(duì)象, 略
JSON對(duì)象流
- 常規(guī)的JSON定義沒(méi)有這種結(jié)構(gòu), 是jq命令支持的一種字符串結(jié)構(gòu)類(lèi)型
- 概念名字是我自己隨便起的, 主要是方便理解
- JSON對(duì)象流和JSON數(shù)組有點(diǎn)類(lèi)似: 是指多個(gè)連續(xù)的JSON對(duì)象組成的字符串, 沒(méi)有[開(kāi)頭, 沒(méi)有]結(jié)尾, 且元素間沒(méi)有分隔符或以空格/換行來(lái)分隔, 形如{}{}{}, 示例如下:
- 特殊地, JSON對(duì)象流也可以是基本屬性流, 如"a" "b" "c", 1 2 3
- 有些情況下JSON對(duì)象流無(wú)法轉(zhuǎn)換成JSON數(shù)組, 通過(guò)sed命令轉(zhuǎn)換
- jq '.' | sed 's/^\}/\},/' | sed '1c \[{' | sed '$c \}]'
{ "productId": "2048200008352211", "productName": "COACH蔻馳佩利系列 馬車(chē)標(biāo)識(shí)米蘭編織鏈?zhǔn)⒈? } { "productId": "2048200008352212", "productName": "COACH蔻馳佩利系列 馬車(chē)標(biāo)識(shí)米蘭編織鏈?zhǔn)⒈?" } { "productId": "2048200008352213", "productName": "COACH蔻馳佩利系列 馬車(chē)標(biāo)識(shí)米蘭編織鏈?zhǔn)⒈?" }
根對(duì)象
是指jq
命令當(dāng)前處理的處理源
的表達(dá)式引用, 在表達(dá)式中用.
來(lái)表示
表達(dá)式/路徑
jq
命令是基于表達(dá)式輸出結(jié)果的, 表達(dá)式可以通過(guò).
來(lái)訪問(wèn)子屬性或子對(duì)象表達(dá)式的語(yǔ)法, 類(lèi)似ognl表達(dá)式(對(duì)象導(dǎo)航語(yǔ)言)如.order.address.city
表示獲取當(dāng)前處理源
order(子對(duì)象)下的address(子對(duì)象)的city
屬性
{ "uid": 11603, "mobile": "172****1333", "order": { "address": { "province": "上海市", "city": "海市", "distict": "浦東新區(qū)", "line": "廣蘭路地鐵站1號(hào)口" }, "items": [ { "itemId": 123, "itemName": "無(wú)人機(jī)1" }, { "itemId": 124, "itemName": "無(wú)人機(jī)2" } ] } }
三. 主要用法
本文示例文件json.txt, 在文章最后
1. 常見(jiàn)表達(dá)式含義
.
: 放在表達(dá)式開(kāi)頭, 用來(lái)表示.
根對(duì)象, 也可用在屬性之間作為訪問(wèn)路徑的連接
.name
: 輸出指定屬性,使用.
連接的路徑訪問(wèn)字段, 路徑可用多層, 如order.items[0].itemId
.[下標(biāo)]
: 輸出單個(gè)指定index的數(shù)組元素(從0開(kāi)始)
.[下標(biāo)1,下標(biāo)2,..]
: 輸出多個(gè)指定數(shù)組元素, 結(jié)果為JSON對(duì)象流
express[]
: 表達(dá)式express
為JSON數(shù)組
, 后面跟[]
表示將express
表示的JSON對(duì)象數(shù)組
轉(zhuǎn)換成JSON對(duì)象流
, 形如:[{},{},{}]
轉(zhuǎn)換成{}{}{}
[表達(dá)式]
: 將JSON對(duì)象流
組合成JSON對(duì)象數(shù)組
,形如:{}{}{}
組裝成[{},{},{}]
,
:需要輸出多個(gè)表達(dá)式的結(jié)果用來(lái)拼接各表達(dá)式, 如jq '.name,.address.city' json.txt
|
: 管道, 相對(duì)于運(yùn)行兩次jq
命令, 前jq運(yùn)行結(jié)果作為后jq的處理源
根據(jù)前jq的運(yùn)行結(jié)果數(shù)據(jù)類(lèi)型分為:- JSON對(duì)象: 可簡(jiǎn)化, 如
jq '.[0]|.address' json.txt
和jq '.[0].address' json.txt
- JSON對(duì)象數(shù)組: 后置表達(dá)式只能用內(nèi)置函數(shù), 如
jq '.[0].arrayBrowser|length' json.txt
- JSON對(duì)象流: 相當(dāng)于對(duì)每個(gè)元素都運(yùn)行后置表達(dá)式, 整體結(jié)果還是
JSON對(duì)象流
,如jq '.[0].arrayBrowser[]|.name' json.txt
注意:
要想對(duì)
JSON對(duì)象數(shù)組
每個(gè)元素進(jìn)行處理, 必須先轉(zhuǎn)換成JSON對(duì)象流
2. 基本使用場(chǎng)景
jq '.' json.txt
– 格式化
jq '.[0].address.city' json.txt
--獲取指定字段的值(可嵌套)
jq '.[0].name,.[0].url' json.txt
--使用逗號(hào)分隔,取多個(gè)字段的值;返回值以換行分隔
jq '.[0].arrayBrowser[0]' json.txt
--提取數(shù)組的單個(gè)元素
jq '.[0].arrayBrowser[0,1]' json.txt
--提取數(shù)組的多個(gè)元素
jq '.[0].arrayBrowser[]' json.txt
– 提取數(shù)組的全部元素轉(zhuǎn)換成JSON對(duì)象流
jq '[.data.results[]|{topicId,viewCount}]' hjsource.json
– 提取數(shù)組的指定屬性
jq '[.data.results[]|{id:topicId,count:viewCount}]' hjsource.json
– 提取數(shù)組的指定屬性并重命名
注意:
上述最后兩個(gè)示例先將
JSON對(duì)象數(shù)組
轉(zhuǎn)化成JSON對(duì)象流
, 再對(duì)各元素進(jìn)行處理, 再組裝成JSON對(duì)象數(shù)組
3. 重組
場(chǎng)景: 重組成對(duì)象
使用方法一: 組裝時(shí)僅復(fù)用value
jq '{simpleName:.[0].name,postUrl:.[0].url}' json.txt
, 得到結(jié)果 :
{
"simpleName": "腳本之家",
"postUrl": "//chabaoo.cn"
}
比較下和jq '.[]|{simpleName:.name,postUrl:.url}' json.txt
的區(qū)別.
(前者處理單個(gè)對(duì)象, 后者處理JSON對(duì)象流
)
2.使用方法二: 組裝時(shí)復(fù)用整個(gè)key-value
運(yùn)行jq '.[0]|{name,url}' json.txt
, 得到結(jié)果:
{
"name": "腳本之家",
"url": "//chabaoo.cn"
}
比較下和 jq '.[]|{name,url}' json.txt
的區(qū)別.
(前者處理單個(gè)對(duì)象, 后者處理JSON對(duì)象流
)
注意:
引用的key-value可以是基本屬性節(jié)點(diǎn), 也可以是對(duì)象節(jié)點(diǎn).
如運(yùn)行
jq '.[0]|{name,address}' json.txt
復(fù)用key-value時(shí)表達(dá)式前面沒(méi)有
.
前綴, 僅復(fù)用value時(shí)才有.
前綴用
,
分隔的多個(gè)表達(dá)式?jīng)]必要任何關(guān)系, 層次也可不一樣
場(chǎng)景: 重組成數(shù)組
在表達(dá)式外邊套上[]
, 即可組裝成數(shù)組. 根據(jù)組合元素的不同, 可以分以下三類(lèi):
- 重組的元素可以是基本屬性, 組合結(jié)果是組裝成基本屬性的數(shù)組
- 重組的元素可以是單個(gè)json對(duì)象, 組合結(jié)果是在外面套個(gè)數(shù)組結(jié)果
- 重組的元素可以是單個(gè)JSON對(duì)象流, 組合結(jié)果是轉(zhuǎn)化成JSON對(duì)象數(shù)組
- 有些情況下JSON對(duì)象流無(wú)法轉(zhuǎn)換成JSON數(shù)組, 通過(guò)sed命令轉(zhuǎn)換
- jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/
1.重組元素為基本屬性
運(yùn)行 jq '[.[0].name,.[0].url]' json.txt
, 得到結(jié)果:
[
"腳本之家",
"//chabaoo.cn"
]
2.重組元素為單個(gè)json對(duì)象
運(yùn)行 jq '[.[0].address]' json.txt
, 得到結(jié)果:
[
{
"city": "廈門(mén)",
"country": "中國(guó)"
}
]
運(yùn)行 jq '[.[0].arrayBrowser]' json.txt
, 得到結(jié)果:
[
[
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
]
3.重組元素為JSON對(duì)象流
jq '[.[]|.arrayBrowser[]]' json.txt
, 得到結(jié)果:
[
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
},
{
"name": "360",
"url": "http://www.so.com"
},
{
"name": "bing",
"url": "http://www.bing.com"
}
]
4. 管道的使用
管道|
的作用, 把管道前的處理結(jié)果作為管道后面處理的輸入. 相當(dāng)于管道前后各運(yùn)行一次jq
命令. (管道可以多次使用)
用法和前面的沒(méi)有區(qū)別. 略
5. 內(nèi)置函數(shù)的使用獲取json對(duì)象的所有key組成的數(shù)組
命令格式: jq keys
, 表達(dá)式只能是keys
, 不能包含其他語(yǔ)法, 如果需要獲取嵌套對(duì)象keys, 通過(guò)管道即可.
運(yùn)行 jq '.[0]|keys' json.txt
, 得到結(jié)果:
[
"address",
"arrayBrowser",
"name",
"url"
]
獲取length
命令格式: jq length
, 表達(dá)式只能是length
, 不能包含其他語(yǔ)法, 如果需要獲取嵌套對(duì)象length, 通過(guò)管道即可.
如果處理對(duì)象是基本屬性, 則length返回其字符個(gè)數(shù). 如
jq '.[0].name|length' json.txt
, 結(jié)果為4
.如果處理對(duì)象是json對(duì)象, 則length返回其屬性個(gè)數(shù). 如
jq '.[0].address|length' json.txt
, 返回2
.如果處理對(duì)象是數(shù)組, 則length返回?cái)?shù)組的長(zhǎng)度. 如
jq '.[0].arrayBrowser|length' json.txt
, 得到2
.
刪除某屬性
命令格式: jq del(屬性表達(dá)式)
, 一般結(jié)合管道使用
該屬性可以是基本屬性, 或json對(duì)象, 或數(shù)組
運(yùn)行 jq '.[0]|del(.address)|del(.arrayBrowser)' json.txt
, 得到結(jié)果:
{
"name": "腳本之家",
"url": "//chabaoo.cn"
}
設(shè)置元素值
命令格式: jq 屬性表達(dá)式=新的值'
, 一般結(jié)合管道使用
新的值
可以是基本屬性, json對(duì)象, 數(shù)組.(雙引號(hào)不能省略)
運(yùn)行 jq '.[0]|.name="myTool"' json.txt
, 得到結(jié)果:
{
"name": "jb51",
"url": "//chabaoo.cn",
"address": {
"city": "廈門(mén)",
"country": "中國(guó)"
},
"arrayBrowser": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
}
增加屬性
命令格式: jq 屬性表達(dá)式+{新的節(jié)點(diǎn)}
, 一般結(jié)合管道使用
其中屬性表達(dá)式
的結(jié)果必須為對(duì)象
新的節(jié)點(diǎn)
只能是基本屬性, 不能是對(duì)象, 數(shù)組.
運(yùn)行jq '.[0].address+{version:"1.0"}' json.txt
, 得到結(jié)果:
{
"city": "廈門(mén)",
"country": "中國(guó)",
"version": "1.0"
}
判斷是否有某屬性
jq '.[0]|has("name")' json.txt
, 返回結(jié)果為true
jq '.[]|.arrayBrowser[]|has("name")' json.txt
#判斷單個(gè)屬性
jq '.[]|.arrayBrowser[]|{a:has("sign"),b:has("name")}' json.txt
#判斷多個(gè)屬性并組裝成JSON對(duì)象
- 其中屬性要用
""
包裹 - 只能判斷子屬性, 不能判斷后代屬性
- 處理源可以為
JSON對(duì)象
和JSON對(duì)象流
四. 示例文件json.txt
[ { "name": "腳本之家", "url": "http://jb51.net", "address": { "city": "廈門(mén)", "country": "中國(guó)" }, "arrayBrowser": [ { "name": "Google", "url": "http://www.google.com" }, { "name": "Baidu", "url": "http://www.baidu.com" } ] }, { "name": "腳本之家", "url": "http://jb51.net", "address": { "city": "大連", "country": "中國(guó)" }, "arrayBrowser": [ { "name": "360", "url": "http://www.so.com" }, { "name": "bing", "url": "http://www.bing.com" } ] } ]
到此這篇關(guān)于處理JSON最強(qiáng)命令jq使用詳解的文章就介紹到這了,更多相關(guān)JSON命令jq使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Linux的alternatives命令替換選擇軟件的版本方法
下面小編就為大家?guī)?lái)一篇使用Linux的alternatives命令替換選擇軟件的版本方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05linux下安裝oracle后使用命令行啟動(dòng)的方法 linux啟動(dòng)oracle
這篇文章主要介紹了在linux下安裝oracle后使用命令啟動(dòng)oracle的方法,大家參考使用吧2014-01-01SVN限制message字符個(gè)數(shù)及格式的實(shí)例
下面小編就為大家?guī)?lái)一篇SVN限制message字符個(gè)數(shù)及格式的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03完美解決ntp的錯(cuò)誤問(wèn)題no server suitable for synchronization fo
下面小編就為大家?guī)?lái)一篇完美解決ntp的錯(cuò)誤問(wèn)題no server suitable for synchronization fo。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03shell編程入門(mén)之正則表達(dá)式實(shí)例代碼
正則表達(dá)式又稱(chēng)規(guī)則表達(dá)式,是對(duì)字符串操作的一種邏輯公式,下面這篇文章主要給大家介紹了關(guān)于shell編程入門(mén)之正則表達(dá)式的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04Shell腳本實(shí)現(xiàn)監(jiān)控iptables運(yùn)行狀態(tài)
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)監(jiān)控iptables運(yùn)行狀態(tài),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-12-12Shell腳本實(shí)現(xiàn)把進(jìn)程負(fù)載均衡到多核CPU中
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)把進(jìn)程負(fù)載均衡到多核CPU中,可以把進(jìn)程指定運(yùn)行在某個(gè)CPU中,需要的朋友可以參考下2014-06-06