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