當前位置:成語大全網 - 新華字典 - 關於使用jq 處理json格式的簡單筆記

關於使用jq 處理json格式的簡單筆記

json格式包含有如下的基本類型 : 數字,字符串,false, true, null

而由基本類型組成的復合類型有 : 數組,對象;其中數組是以 [ ] 進行標記的,而對象是以 { } 進行標記;

jq 這個命令用來處理json數據格式,非常方便,簡單記錄其常用的使用方法如下:

A. 對於數組的處理:

1). 如果 jq 要處理的json是 數組類型,那麽用 “ jq .[ ] ” 可以將數組的最外層的[ ] 標記脫掉, 從而變成 對象 類型。

2). 上述命令的 中括號裏面可以帶有參數,這個參數就是 數組的下標,這個下標從前向後最小是 0,最大值沒有限制,如果超出,那麽就會return null. 同時支持下標從後向前基數,最小為-1. 但是參數的值除了數字,不可以是空格. 同時數組的下表支持 切片,也就是 [2:7] 或者 [1,2,5,7] 這種格式都是支持的.

B. 對於對象的處理:

1). 因為對象裏面的每個元素都是 key:value的形式存在,雖然value 也可以是壹個復合類型,但是不影響 key:value 這種格式,所以對於對象,通常用 jq .key 這種方式來獲取對應key的value. 其中key 在這裏可以不用引號括起來,當然也可以用引號括起來,反正key都是字符串類型。

2). 如果要獲得對象所有元素的key值,那麽要把 |keys 串接在對象後面,需要註意的是 這裏不是利用的shell的管道,而是jq內置的管道,所以屬於jq的參數的壹部分. 例如:

其實 keys 屬性不僅僅支持 對象,也支持json 數組,比如:

3). 判斷是否存在某個key.

在上面利用jq內置的 keys 屬性,可以獲取所有的key, 其實還有jq內置的has 方法,這個方法可以判斷對應的key是否存在. 例子如下:

4). jq 的查找結果避免輸出 錯誤,轉而輸出null

在查找條件的後面加上壹個問號,那麽如果找不到就不會輸出任何的error, 相應的輸出壹個null來替代. 這個問號可以加在方法的後面(後面的例子中可以看到)。這在遞歸查找的時候非常有用;否則可能會出現報錯的情形.

5). jq 的查找結果為空,避免輸出null ,而是什麽都不輸出

目前不知道怎麽實現,暫且用其他的linux 命令來過濾吧

6). 根據指定的關鍵字查找有該關鍵字的key,也就是模糊查找

jq 支持PCRE 正則表達式,所以支持模糊搜索, 這裏主要展示用scan 方法輸出模糊搜索的結果. 用法實例如下:

7). 根據指定的key, 查找嵌套對象中所有該key的value,輸出該value

使用 .. 或者 recurse 來表示遞歸查找,然後通過管道進行常規的查找就可以了,舉例如下:

8). 如何將匹配key 的 key 和value 壹起進行輸出?

以上的命令表示遞歸方式,獲取Key為name的所有key:value對,並以key:value的方式進行輸出,但是空的字典對象如何排除呢? 目前還沒有發現好的解決方法

9). 因為keys 屬性支持對象的同時,也支持數組,所以如何來剔除數組而只是要對象的keys呢?

有壹個walk 方法可以實現,但是不常用,所以這裏不做討論.

10).嵌套的模糊查找,上面描述了用scan進行模糊查找,以及用recurse來進行嵌套,如何兩者結合呢?

因為scan方法只能夠作用於字符串,所以不可以簡單的將recurse和scan 結合起來使用,這裏需要通過keys來實現 嵌套的模糊查詢. 舉例如下:

11). 其他使用小tips:

在可以使用 .key1.key2 這種情況下,也可以使用 .key1|.key2 的格式,個人更傾向於使用 .key1|.key2 ,因為看起來更清晰明了. 比如下面的例子.

在大多數情況下我們看到的json 復合格式最外層都是數組的形式,而不是對象的形式,這個是因為什麽原因呢? 因為json的對象必須是 key:value 的格式,雖然value 也可以是壹個復合格式,但是壹定需要key:value 形式,而 數組的不同元素的類型之間沒有任何的關聯,同壹個數組,既可以包含有字符串元素,也可以包含對象元素,還可以包含數字... ,因此壹個復合類型的 json格式壹般最外層都是數組的形式.

首先用模糊查詢,配合遞歸查找相應的key;-----簡言之,就是找到key

然後用特定的key, 配合遞歸查詢找到所有的結果;------簡言之,就是依據key遍歷到所有的值

最後對上述的結果做進壹步的處理得到需要的結果. -----簡言之,對得到的值做進壹步的過濾獲得真正需要的結果

簡單例子如下下:

簡單總結: