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