javascript
json 格式化工具_如何在命令行中优雅地处理JSON
當年剛出道的時候,整天使用 grep/cut/awk 處理各種純文本日志。那時候的日志都是一行一條,內容使用特定分割符。使用各種 unix 命令配合管道真可謂得心應手。
然而,到了 9102 年,好多數據都以 json 形式傳輸和存儲。awk 這類工具在 json 處理方面就有點力不從心了,畢竟是幾十年前開發的工具。那有沒有針對 json 專門開發的工具呢?答案是肯定的,這就是本文要介紹的 jq 命令。
jq?stedolan.github.iojq 支持各種 unix 系統,請自行安裝。現在單講幾種使用場景。
先來一個段 json 數據,內容如下(并寫入 a.json 文件):
{"code":0,"message":"0","ttl":1,"data":{"results":[{"item_id":1342,"type":1},{"item_id":1785,"type":2},{"item_id":1413,"type":3}]}}首先要做的就是格式化,這是 jq 最簡單的功能:
cat a.json | jq ''輸出效果如下(還有語法高亮):
使用 jq 格式化 json如果 json 很長,則可以使用管道傳給 less 命令:
cat a.json | jq '' | less如果你自己試一下就會發現,less 展示的結果沒有顏色,這怎么能忍?
終端下的顏色是由轉義序列控制的。有興趣的同學可以參考我的拙作
濤叔:多彩的終端?zhuanlan.zhihu.com像 jq 這類的工具會檢測輸出目的地是否為終端環境(tty),如果不是(比如管道或普通文件)則不會輸出顏色轉義序列,否則這些轉義序列會破壞文件內容。
但如果確定讀寫雙方都支持轉義序列,我們就可以強制開啟顏色輸出:
jq -C '' a.json|less -R這里用到了 jq 的 -c參數和 less 的 -R 參數。
現在介紹 jq 的高級操作。還是以上面的 json 為例。
{"code": 0,"message": "0","ttl": 1,"data": {"results": [{"item_id": 1342,"type": 1},{"item_id": 1785,"type": 2},{"item_id": 1413,"type": 3}]} }顯然,這是一個比較負雜的數據結構。我們可以使用 jq 提取部分字段
$ cat a.json | jq '.code, .ttl' 0 1提取字段使用. 操作,提取多個字段可以使用, 連接。
如果我們想提取 results 內容,則可以這樣:
$ cat a.json | jq '.data.results' [{"item_id": 1342,"type": 1},{"item_id": 1785,"type": 2},{"item_id": 1413,"type": 3} ]是不是清真多了?
傳統的 unix 工具是以行為單位,而 json 數組的每個元素可能有復雜的數據結構(多行),我們能否以元素為單位處理 json 數據呢?當然可以。
提取數組的元素字段
$ cat a.json | jq '.data.results' | jq '[].item_id' 1342 1785 1413提取多個數組元素字段
$ cat a.json | jq '.data.results' | jq '[]|.item_id,.type' 1342 1 1785 2 1413 3結果是 item_id 和 type 交替出現,傳統的 unix 工具依然不好處理。能將同一元素的不同字段放到一行嗎?當然可以:
$ cat a.json | jq '.data.results' |jq '.[] |"item_id:(.item_id) type:(.type)"' "item_id:1342 type:1" "item_id:1785 type:2" "item_id:1413 type:3"這里用到了所謂的 string interpolation 語法,有點像 swift 語言。好了,現在你可以再配合其他 uinx 工具對數據進行處理了。
jq 還支持很多高級特性,有興趣的同學可以參考官方手冊。本文的重點是介紹 jq 最核心的 20% 功能,基本可以解決 80% 的問題。
先寫這么多,有問題請留言討論。
總結
以上是生活随笔為你收集整理的json 格式化工具_如何在命令行中优雅地处理JSON的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Find N元宇宙奇旅NFT限
- 下一篇: 信用卡最低还款产生的利息可以退了?