jq 是領域特定高階的純函數語言程式設計語言，它採用詞法作用域，其中所有 JSON 值都是常量。jq 支援回溯並可管理 JSON 資料的無限長字串流。jq 支援基於名字空間的模組系統，並對閉包有一定支援，尤其是它的函式和泛函表示式可以用作其他函式的引數。 jq 與 Icon 和 Haskell 程式語言有關。它最初採用 Haskell 實現，隨即移植至 C 語言。gojq 是 純 Go 實現。jq 還有用 Rust 實現的叫做 jaq 的方言，它規定了指稱語義 。 歷史 jq 由 Stephen Dolan 建立並在 2012 年 10 月發行 。它被設計為 針對 JSON 資料的 sed 類似者。在 jq 版本 15 中增加支援了正則表示式。 針對 jq 的叫做 yq 的 包裝器 yq，增加支援了 YAML、XML 和 TOML。它首次發行於 2017 年。 用 Go 實現的 gojq 最初發行於 2019 年，gojq 顯著的擴充套件 jq 包括了支援 YAML。 用 Rust 實現的 jaq，其專案目標是更快速和更準確的 jq 實現，仍保持與 jq 在大多數情況下的相容性。在 2024 年 3 月於其目標中排除了 jq 的特定高階特徵，比如模組、SQL 風格運算元和給非常大 JSON 文件的串流解析器。 用 jq 實現的 jqjq，最初發行於 2022 年。jqjq 顯著的可以執行自身，擁有 REPL 並支援 eval。 用法 命令列用法 jq 典型的用於命令列，並可以協作於其他命令列實用工具，比如 curl。下面的例子展示如何將命令的輸出透過管道接轉到 jq，從而確定同這個 Wikipedia 頁面關聯的範疇名字： URLhttpszhwikipediaorgwapiphpactionparsepageJq E8 AF AD E8 A880formatjson curl s URL jq parsecategories 這裡的流水線產生的輸出，由 JSON 字串的串流組成，它們是： 小寫標題 CS1 英語來源_en 動態型別程式語言 函數語言程式設計語言 面向文字程式語言 2012 年建立的程式語言 資料查詢語言 2012 年軟體 上述命令對這個頁面使用了 MediaWiki API 來產生 JSON 響應。管道（pipe）符號允許的輸出由 jq 來訪問，它是標準的 Unix shell 的程序間通訊機制。 這裡展示的 jq 過濾器的方法鏈是如下流水線（pipeline）的簡寫： parse categories 這對應於呼叫所產生的巢狀 JSON 結構。jq 流水線的構造方式，同 Unix 風格流水線一樣，採用管道符號。 嵌入式用法 C 語言和 Go 實現二者都提供函式庫，使得 jq 功能可以嵌入到其他應用和程式設計環境之中。 例如，gojq 已經集成於 SQLite，故而函式可以在其 SQL 語句中獲得到。這些函式被標記為 確定性的deterministic，故而可以被用在 CREATE INDEX 命令中。 運算的模態 jq 預設的充當針對 JSON 輸入的 串流編輯器，非常像被當作多行文字的 串流編輯器 的 sed 實用工具。但是 jq 有一些其他運算模態： 它可以將來自一個或多個來源的輸入當作文字的諸行； 它可以將來自特定來源的輸入的串流收集到一個 JSON 陣列之中； 它可以使用所謂的 串流解析器 解析其輸入，產生針對所有 葉子 路徑的 PATH VALUE 陣列的串流。 串流解析器（streaming parser），在一個或多個 JSON 輸入太大無法載入記憶體之時特別有用，因為它需求的記憶體典型的相當小。例如，對於任意大的 JSON 物件的陣列，峰值記憶體需求不比處理最大頂層物件所需要的多出很多。 這些運算模態可以在特定限制下組合起來。 語法和語義 型別 所有 JSON 值自身是 jq 中的值，它們從而有在下列表格中展示的型別。gojq 和 jaq 實現將數區分為整數和浮點數。gojq 實現支援無界精度整數算術，同於 jq 採用 Haskell 的最初實現。 jq 支援的型別總結 型別 過濾器 例子 數 numbers 字串 strings 布林值 booleans 陣列 arrays 物件 objects 空值 nulls 是通常表示空值的一個值 httpswwwjsonorgjsonenhtml null，就像任何其他 JSON 標量一樣；它不是空指標。（對應於 NaN）和 infinite（參見 IEEE 754），是僅有的兩個不是 JSON 值的 jq 標量。 形式 jq 有特殊語法形式，比如： ：變數繫結； 和：更新賦值和平凡（plain）賦值； if then elif then else end：條件構造； reduce EXP as var INIT UPDATE：串流歸約； ：輸出中間值的串流歸約； ：函式建立； include MOD 和 import MOD as name：模組的包含和匯入。 jq 中有兩種型別的符號，可稱為 變數 的值繫結和函式。二者都是詞法作用域的，表示式只能提及其左側即前面最近的定義的符號，但是函式可以提及自身來建立遞迴函式。 過濾器 jq 是面向 JSON 的程式語言，使用 符號來連線過濾器形成流水線。例如： echo 12 jq add 3 jq n 12 add 3 這裡 jq 內的 JSON 陣列 12 是求值為陣列的一個 jq 過濾器。 儘管類似於 Unix 流水線，jq 流水線允許將到來資料，如同並行的傳送到在 右手端的多於一個接收者。例如，程式 addlength 將計算陣列中數的平均，故而： jq n 12 addlength 15 jq nc 12 length add addlength 2315 單獨的點號。可以充任佔位符（placeholder）或萬用字元，例如： jq nc 1 11 jq n 2 pow 4 在 jq 中斐波那契數列可以採用隱式程式設計風格，透過遞迴運算 recurse 定義為，下面是其使用例子： echo 0 1 2 6 jq c limit 1 01 recurse last add first 0 01 011 0112358 echo 0 1 2 6 jq c limit 01 recurse last add last 1 11 112358 jq n first 01 recurse last add first 0 jq n 0126 nth 01 recurse last add first 0 1 1 8 jq nc 0126 map nth 01 recurse last add first 0118 這種無限列表不可以不加限定的使用，也不可以對其進行取最後一個元素的運算 last 。下面將其定義為新的命名過濾器： def fib nth 01 recurse last add first 下面的例子展示如何定義引數化的命名過濾器，它格式化從 2 到 36 含二者的任何底數的整數： def tobase b def digit 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ1 def mod b def div mod b def place_values recurse select b div mod select 2 b and b 36 place_values digit reverse add 將其儲存入 tobasejq 檔案，接著使用這個函式： echo 15 16 jq include tobase tobase 16 F 10 下一個例子求解經典的覆面算數學遊戲： begin matrix text S text E text N text D text M text O text R text E hline text M text O text N text E text Y end matrix 從 M 是在最高位的進位可知：M 為 1，S 為 8 或 9，O 為 0，程式碼展示了基於 range 和 的生成器： def send_more_money def choose m n k used range m n1 used used k def num a b c d 1000a 100b 10c d def num a b c d e 10num a b c d e choose 8 9 s m1o0 as t choose 2 9 e t as t choose 2 9 n t as t choose 2 9 d t as t choose 2 9 r t as t choose 2 9 y t select num s e n d num m o r e num m o n e y sendmoremoney send_more_money jq 採用詞法作用域規則，choose t 提及的是在它前面最近的變數 t，它的結果被 as 命名為新的同名變數 t。將上述程式碼儲存入 send_more_moneyjq 檔案，接著使用這個函式得到這個謎題僅有的一個解： jq nc f send_more_moneyjq 9567108510652 解析表示式文法 在 jq 和解析表示式文法（PEG）形式化之間有密切關聯。這種關聯源於下列表格中展示的 PEG 七個基本運算與 jq 構造之間的等價性。 PEG 運算與對應的 jq 等價者 PEG 運算名字 PEG 表示法 jq 運算或 def 序列 有序選擇 零或多個 一或多個 可選 與斷言 E in 非斷言 八皇后問題例子 回溯法求解八皇后問題，採用函數語言程式設計風格的條件表示式和遞迴函式可以寫為： def queens def place r c pl all pl 0 c and all pl 1 rc and all pl 2 rc def q r pl if r 8 then range 0 8 select place r pl pl 0 pl 1r pl 2r q r1 else 0 map abcdefgh1 as s s 01 s 12 s 23 s 34 s 45 s 56 s 67 s 78 sort end q 0 queens 將這段程式碼儲存入 queensjq 檔案中，下面演示其執行結果並提取其 92 個解中的前兩個解： jq nc f queensjq wc l 92 jq nc f queensjq sed n 12p a1b7c5d8e2f4g6h3 a1b7c4d6e8f2g5h3 這個儲存傳遞風格實現的 3 種位置列表，共有 39 27 個列表和 39082 108 個元素，而在能採用可逆（reversible）賦值和靜態變數的語言比如 Icon 的實現中，其 3 個位置列表共有 81515 38 個元素。 進一步採用隱式程式設計風格，上述程式碼可以寫為： def queens def place r c pl all pl 0 c and all pl 1 rc and all pl 2 rc def q r pl range 0 8 select place r pl pl 0 pl 1r pl 2r q 0 as t q 1 t as t q 2 t as t q 3 t as t q 4 t as t q 5 t as t q 6 t as t q 7 t0 map abcdefgh1 as s s 01 s 12 s 23 s 34 s 45 s 56 s 67 s 78 sort queens 註釋 參考書目 引用 外部連結 jq homepage gojq the Pure Go implementation jaq the Rust implementation jqjq the jq implementation jq FAQ Awesome jq curated listing of jqrelated resources The jq Programming Language page on the Rosetta Code comparative programming tasks project site Category 動態型別程式語言 Category 函數語言程式設計語言 Category 面向文字程式語言 Category2012 年建立的程式語言 Category 資料查詢語言 Category2012 年軟體