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