繼我們學會取物件屬性的值之後,接下來該看看 Array: 陣列。
師傅:徒弟,現在懂得如何處理單個JSON物件了吧?
徒弟:是的,師傅!我覺得我已經掌握得差不多了。
師傅:哼,別太得意。現在來點刺激的!我們來玩玩陣列。
徒弟:陣列?那是...一堆JSON物件放在一起?
師傅:差不多。先把資料抓下來:curl -s https://jsonplaceholder.typicode.com/todos > todos.json
徒弟:好的,師傅。我已經執行了這個命令。接下來呢?
師傅:現在用 jq 看看裡面有什麼:jq "." todos.json
徒弟:哇!這麼多資料!看起來像是一大堆物件...在方括號裡面?
師傅:沒錯,這就是陣列。想知道有多少個物件嗎?
徒弟:當然想!我們要怎麼數呢?
師傅:簡單!jq "length" todos.json
徒弟:哇,200個!那...我們怎麼獲取特定的物件呢?
師傅:用索引,jq ".[0]" todos.json
給你第一個,jq ".[199]" todos.json
給你最後一個。
徒弟:我明白了!那如果我想要所有物件的 title 呢?
師傅:不錯,開始思考了!試試這個:jq ".[].title" todos.json
這邊我們先用前一天學到的技巧 curl -s https://jsonplaceholder.typicode.com/todos > todos.json
,將 "TODO 陣列" 儲存為本地的檔案 todos.json
。
我們在 Day4: JSON 學習小站 看過。JSON 的基本型別。jq 支援與 JSON 相同的型別 - 數字、字串、布林值、陣列、物件(注意在 JSON 中物件的鍵(key)只能是字串(string))和「null」。
這是 jq 內建的函式,用來看輸入值的長度。結果會因為輸入值的型別不同,而有不同的意義。我將個別型別對應的回傳整理如下表。
型別 | 長度(length函式回傳) |
---|---|
數字 | 它的絕對值 |
字串 | 它包含的 Unicode 碼位的數量(如果是純 ASCII,則與 JSON 編碼的位元組長度相同) |
布林 | 錯誤 ❗ |
陣列 | 元素的數量 |
物件 | 鍵值對(key-value pairs)的數量 |
null | 0 |
例如,取得 "TODO 陣列"來自(todos.json)的長度的指令如下:
jq "length" todos.json
下圖是另外用工具看的 todos.json,是一個內有200個物件的陣列([{物件}x200]
)
.[數字]
當索引值為整數時, .[數字]
可以查找陣列。陣列索引是從零開始的,因此.[2]會返回第三個元素。
指令 jq ".[0]" todos.json
可取得 TODO陣列的第一個元素,參考下圖。
jq 的索引值是允許負值的,-1
指最後一個元素,-2
指倒數第二個元素,依此類推。
指令 jq ".[199]" todos.json
和 jq ".[-1]" todos.json
可取得 TODO陣列的最後一個元素,參考下圖。
.[]
陣列 iterator如果使用 .[數字]
語法,但完全省略索引數字,變成 .[]
,它將傳回陣列的所有元素。使用[1,2,3]這樣的簡單陣列去執行 jq filter .[]
將產生三個獨立結果的數字,而不是陣列。
.[]
也可以用在物件上,它將傳回物件的所有屬性值。
將 TODO 陣列所有元素回傳的指令是 jq ".[]" todos.json
,200個元素太多,截圖後面就省略囉。
將 TODO 陣列所有元素的 Title 屬性值回傳的指令是 jq ".[].title" todos.json
。一樣會有200個title,截圖後面就省略囉。
今天我們學到了使用 jq filter 來取得陣列中的元素 .[數值]
;進一步,陣列中的元素是物件,我們可以使用先前學到的取得物件值的方式,取回物件中的屬性值。
使用 jq filter 表達式,在簡潔的指令就能從複雜的 JSON 取回自己要找的內容,是否感覺充滿了自信呢! 感謝自己即使是周末也沒有放棄😝繼續學習~