javascript
处理JSON最强命令jq使用详解
史上最全jq命令使用詳解
- 一. 前言
- 二. 語法
- 1. 使用語法
- 2. 概念理解
- 三. 主要用法
- 1. 常見表達(dá)式含義
- 2. 基本使用場景
- 3. 重組
- 4. 管道的使用
- 5. 內(nèi)置函數(shù)的使用
- 四. 示例文件json.txt
一. 前言
本文價(jià)值千金, 閱讀前請先收藏.
jq命令是處理json字符串的神器, 主要用于獲取JSON屬性/簡單重組JSON字符串.
本章將詳細(xì)介紹jq的主要應(yīng)用場景, 幫助大家在平時(shí)工作中處理JSON的效率大大提升.
二. 語法
1. 使用語法
jq 表達(dá)式 處理源
處理源可以為文件路徑或管道: 讀取后必須為JSON對象, JSON數(shù)組, JSON對象流三類
2. 概念理解
- JSON對象
以{開頭, 以}結(jié)尾的JSON字符串, 形如{}示例:
- JSON數(shù)組
以[開頭, 以]結(jié)尾的JSON字符串, 元素間用,分隔
包括基本數(shù)組和JSON對象數(shù)組, 形如[{},{},{}]
基本數(shù)組: 元素為基本數(shù)據(jù)類型, 如[1,2,3,5], [“shanghai”, “guangzhou”,“beijing”]
JSON對象數(shù)組: 元素為JSON對象, 略
- JSON對象流
jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/
-
根對象
是指jq命令當(dāng)前處理的處理源的表達(dá)式引用, 在表達(dá)式中用.來表示
-
表達(dá)式/路徑
jq命令是基于表達(dá)式輸出結(jié)果的, 表達(dá)式可以通過.來訪問子屬性或子對象
表達(dá)式的語法, 類似ognl表達(dá)式(對象導(dǎo)航語言)
如.order.address.city表示獲取當(dāng)前處理源order(子對象)下的address(子對象)的city屬性
三. 主要用法
本文示例文件json.txt, 在文章最后
1. 常見表達(dá)式含義
. : 放在表達(dá)式開頭, 用來表示.根對象, 也可用在屬性之間作為訪問路徑的連接
.name: 輸出指定屬性,使用.連接的路徑訪問字段, 路徑可用多層, 如order.items[0].itemId
.[下標(biāo)] : 輸出單個(gè)指定index的數(shù)組元素(從0開始)
.[下標(biāo)1,下標(biāo)2,..] : 輸出多個(gè)指定數(shù)組元素, 結(jié)果為JSON對象流
express[] : 表達(dá)式express為JSON數(shù)組, 后面跟[]表示將express表示的JSON對象數(shù)組轉(zhuǎn)換成JSON對象流, 形如: [{},{},{}]轉(zhuǎn)換成{}{}{}
[表達(dá)式] : 將JSON對象流組合成JSON對象數(shù)組,形如: {}{}{}組裝成[{},{},{}]
,:需要輸出多個(gè)表達(dá)式的結(jié)果用來拼接各表達(dá)式, 如 jq '.name,.address.city' json.txt
| : 管道, 相對于運(yùn)行兩次jq命令, 前jq運(yùn)行結(jié)果作為后jq的處理源
根據(jù)前jq的運(yùn)行結(jié)果數(shù)據(jù)類型分為:
JSON對象: 可簡化, 如jq '.[0]|.address' json.txt 和 jq '.[0].address' json.txt
JSON對象數(shù)組: 后置表達(dá)式只能用內(nèi)置函數(shù), 如jq '.[0].arrayBrowser|length' json.txt
JSON對象流: 相當(dāng)于對每個(gè)元素都運(yùn)行后置表達(dá)式, 整體結(jié)果還是JSON對象流,
如jq '.[0].arrayBrowser[]|.name' json.txt
注意:
要想對JSON對象數(shù)組每個(gè)元素進(jìn)行處理, 必須先轉(zhuǎn)換成JSON對象流
2. 基本使用場景
jq '.' json.txt – 格式化
jq '.[0].address.city' json.txt --獲取指定字段的值(可嵌套)
jq '.[0].name,.[0].url' json.txt --使用逗號分隔,取多個(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對象流
jq '[.data.results[]|{topicId,viewCount}]' hjsource.json – 提取數(shù)組的指定屬性
jq '[.data.results[]|{id:topicId,count:viewCount}]' hjsource.json – 提取數(shù)組的指定屬性并重命名
注意:
上述最后兩個(gè)示例
先將JSON對象數(shù)組轉(zhuǎn)化成JSON對象流, 再對各元素進(jìn)行處理, 再組裝成JSON對象數(shù)組
3. 重組
- 場景: 重組成對象
jq '{simpleName:.[0].name,postUrl:.[0].url}' json.txt , 得到結(jié)果 :
{"simpleName": "站長工具","postUrl": "http://tool.chinaz.com" }比較下和jq '.[]|{simpleName:.name,postUrl:.url}' json.txt 的區(qū)別.
(前者處理單個(gè)對象, 后者處理JSON對象流)
運(yùn)行jq '.[0]|{name,url}' json.txt , 得到結(jié)果:
{"name": "站長工具","url": "http://tool.chinaz.com" }比較下和 jq '.[]|{name,url}' json.txt 的區(qū)別.
(前者處理單個(gè)對象, 后者處理JSON對象流)
注意:
引用的key-value可以是基本屬性節(jié)點(diǎn), 也可以是對象節(jié)點(diǎn).
如運(yùn)行jq '.[0]|{name,address}' json.txt
復(fù)用key-value時(shí)表達(dá)式前面沒有.前綴, 僅復(fù)用value時(shí)才有.前綴
用,分隔的多個(gè)表達(dá)式?jīng)]必要任何關(guān)系, 層次也可不一樣
- 場景: 重組成數(shù)組
在表達(dá)式外邊套上[], 即可組裝成數(shù)組. 根據(jù)組合元素的不同, 可以分以下三類:
jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/
運(yùn)行 jq '[.[0].name,.[0].url]' json.txt, 得到結(jié)果:
["站長工具","http://tool.chinaz.com" ]運(yùn)行 jq '[.[0].address]' json.txt , 得到結(jié)果:
[{"city": "廈門","country": "中國"} ]運(yùn)行 jq '[.[0].arrayBrowser]' json.txt , 得到結(jié)果:
[[{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}] ]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命令. (管道可以多次使用)
用法和前面的沒有區(qū)別. 略
5. 內(nèi)置函數(shù)的使用
- 獲取json對象的所有key組成的數(shù)組
命令格式: jq keys , 表達(dá)式只能是keys , 不能包含其他語法, 如果需要獲取嵌套對象keys, 通過管道即可.
運(yùn)行 jq '.[0]|keys' json.txt , 得到結(jié)果:
["address","arrayBrowser","name","url" ]- 獲取length
命令格式: jq length , 表達(dá)式只能是length , 不能包含其他語法, 如果需要獲取嵌套對象length, 通過管道即可.
如果處理對象是基本屬性, 則length返回其字符個(gè)數(shù). 如jq '.[0].name|length' json.txt , 結(jié)果為4.
如果處理對象是json對象, 則length返回其屬性個(gè)數(shù). 如jq '.[0].address|length' json.txt, 返回2.
如果處理對象是數(shù)組, 則length返回?cái)?shù)組的長度. 如jq '.[0].arrayBrowser|length' json.txt , 得到2.
- 刪除某屬性
命令格式: jq del(屬性表達(dá)式) , 一般結(jié)合管道使用
該屬性可以是基本屬性, 或json對象, 或數(shù)組
運(yùn)行 jq '.[0]|del(.address)|del(.arrayBrowser)' json.txt , 得到結(jié)果:
{"name": "站長工具","url": "http://tool.chinaz.com" }- 設(shè)置元素值
命令格式: jq 屬性表達(dá)式=新的值' , 一般結(jié)合管道使用
新的值可以是基本屬性, json對象, 數(shù)組.(雙引號不能省略)
運(yùn)行 jq '.[0]|.name="myTool"' json.txt, 得到結(jié)果:
{"name": "myTool","url": "http://tool.chinaz.com","address": {"city": "廈門","country": "中國"},"arrayBrowser": [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}] }- 增加屬性
命令格式: jq 屬性表達(dá)式+{新的節(jié)點(diǎn)} , 一般結(jié)合管道使用
其中屬性表達(dá)式的結(jié)果必須為對象
新的節(jié)點(diǎn)只能是基本屬性, 不能是對象, 數(shù)組.
運(yùn)行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 #判斷單個(gè)屬性
jq '.[]|.arrayBrowser[]|{a:has("sign"),b:has("name")}' json.txt #判斷多個(gè)屬性并組裝成JSON對象
四. 示例文件json.txt
[{"name": "站長工具","url": "http://tool.chinaz.com","address": {"city": "廈門","country": "中國"},"arrayBrowser": [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}]},{"name": "站長之家","url": "http://tool.zzhome.com","address": {"city": "大連","country": "中國"},"arrayBrowser": [{"name": "360","url": "http://www.so.com"},{"name": "bing","url": "http://www.bing.com"}]} ]總結(jié)
以上是生活随笔為你收集整理的处理JSON最强命令jq使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leaflet创建,tileLayer,
- 下一篇: 微电子电路——例题期末总结