使用jq處理JSON數據(一)

在平常的工作中,遇到的接口響應格式絕大多數都是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

源碼大家可以點擊閱讀原文找到GitHubGitee的地址。

在本文中,我們將學習如何使用jq命令行優雅地處理JSON格式數據。

jq可在各種平臺上運行,可用於LinuxWindowsMac 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"

如何我們想提取數組對象中某一個keyvalue集合,可以這麼寫:

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

我們首先驗證接口正常,URLhttp://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源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章