在平常的工作中,遇到的接口響應格式絕大多數都是JSON
格式,對於這種格式的數據有時候又愛又恨。很多時候要看懂層級,很多人會使用一些格式化工具(包括在線工具)。我自己寫了一個方法來處理JSON
格式的數據,之前寫過文章:將json數據格式化輸出到控制檯,後來又更新了一些其他功能,修復了一些BUG
,展示格式如下:
INFO-> 當前用戶:fv,IP:192.168.0.102,工作目錄:/Users/fv/Documents/workspace/funtester/,系統編碼格式:UTF-8,系統Mac OS X版本:10.16
INFO->
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "msg":"FunTester",
> ① . "new":{
> ② . . . "36safs3":324,
> ② . . . "36s234s3":324,
> ② . . . "32432":4324,
> ② . . . "data":{
> ③ . . . . . "32":411324
> ② . . . }
> ① . },
> ① . "new21":322
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
Process finished with exit code 0
源碼大家可以點擊閱讀原文找到GitHub
和Gitee
的地址。
在本文中,我們將學習如何使用jq
命令行優雅地處理JSON
格式數據。
jq
可在各種平臺上運行,可用於Linux
、Windows
和Mac OS
。
對於以下許多示例,我們將使用一個名爲FunTester.json
的文件,其中包含以下JSON
內容:
{
"name": "FunTester",
"article": [{
"author": "tester1",
"title": "ApiTest"
}, {
"author": "tester2",
"title": "performanceTest"
}
]
}
jq基本語法
通常,通過將JSON
管道輸送到其標準輸入來調用jq
。如下:
FunTester:~ fv$ echo '{"name":"FunTester"}' | jq
{
"name": "FunTester"
}
沒有任何參數,jq
只是輸出JSON
輸入數據,這裏輸出數據已重新格式化。jq
默認情況下輸出格式的JSON
。我們可以將少量的JSON
數據通過管道傳遞給jq
並獲得格式正確的輸出。
jq
可以使用一個或多個過濾器作爲參數。最簡單的過濾器是.
。返回整個JSON
數據的內容,這一點跟JsonPath
類似,有興趣的同學可以翻一翻我寫過的JsonPath
的文章。
下面的shell
跟上面的命令行結果是一致的。
echo '{"name":"FunTester"}' | jq '.'
現在,我們可以向過濾器添加一個簡單的對象標識符。爲此,我們將使用前面提到的FunTester.json
文件。通過.name
獲取名字的內容。
FunTester:Downloads fv$ cat FunTester.json | jq '.name'
"FunTester"
可以使用[]
語法獲取數組信息:
FunTester:Downloads fv$ cat FunTester.json | jq '.article[1]'
{
"author": "tester2",
"title": "performanceTest"
}
同理,我們可以將這兩個語法組合起來:
FunTester:Downloads fv$ cat FunTester.json | jq '.article[1].title'
"performanceTest"
如何我們想提取數組對象中某一個key
的value
集合,可以這麼寫:
FunTester:Downloads fv$ cat FunTester.json | jq '.article[].title'
"ApiTest"
"performanceTest"
處理響應
當然,我們也可以用jq
處理響應結果。這是一個jq
常見用法,我用moco API
封裝框架,將上面的JSON
數據當做一個接口的響應。
此處省略代碼500行
server.get(urlOnly("/jq/test")).response(RWUtil.readTextByString("/Users/fv/Downloads/FunTester.json"))
此處省略代碼500行
我們首先驗證接口正常,URL
爲http://localhost:12345/jq/test
,放到瀏覽器中能夠看到FunTester.json
文件的內容,爲了不干擾各位閱讀,這裏就不重複放了。
下面我們用curl
命令訪問接口,並獲取響應結果,然後使用jq
命令獲取一些值的集合。
FunTester:Downloads fv$ curl http://localhost:12345/jq/test | jq '.name,.article[1].author'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 223 100 223 0 0 13937 0 --:--:-- --:--:-- --:--:-- 13937
"FunTester"
"tester2"
這個地方,我在此處使用逗號分隔了兩個不同的過濾器。
相比JsonPath
工具,jq
更像是命令行版本的JsonPath
,而且輸出格式方面非常不錯的效果。接下來,我會繼續探索jq
工具的函數語法使用。
FunTester,騰訊雲年度作者、Boss直聘簽約作者,GDevOps全球敏捷峯會官方合作媒體,非著名測試開發er。
本文分享自微信公衆號 - FunTester(NuclearTester)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。