Man

jq –stream 手冊頁中路徑和葉數組的定義是什麼意思

  • August 12, 2021

jq手冊頁中,--stream選項說:

以流方式解析輸入,輸出路徑和葉值數組(標量和空數組或空對象)。例如,"a"變成[[],"a"][[],"a",["b"]]變成[[0],[]][[1],"a"],和[[1,0],"b"]

我想知道“路徑和葉值數組”的含義以及為什麼輸入表示被轉換為:

"a" -> [[],"a"]

[[],"a",["b"]] ->  [[0],[]]  , [[1],"a"]  , [[1,0],"b"]

我一直在審查像列表表示這樣的樹,但它並不相似。

這對jq1.6 版有效:

在流模式下,您得到的是一系列對輸入中的數據進行編碼的數組。每個數組都由一個編碼路徑的數組和該路徑上的一個值組成(我相信你稱之為“葉值”)。為了表示流中對像或數組的終止,會發出一個沒有值的數組。

例如,JSON 對象{"key":"value"}將作為兩個數組進行流式傳輸

[["key"],"value"]
[["key"]]

第一個流數組由路徑和值組成。路徑很簡單["key"],因為該鍵是頂級鍵。該路徑的值為"value"

第二個數組只有路徑,沒有值,表示該流對象的結束(在輸出流中該對象將不再有鍵)。

另一個例子:

複合對象

{
 "array": [
   1,
   2,
   {
     "hello": "world"
   }
 ]
}

將流式傳輸為

[["array",0],1]
[["array",1],2]
[["array",2,"hello"],"world"]
[["array",2,"hello"]]
[["array",2]]
[["array"]]

第一個數組包含路徑["array",0],即數組的第一個元素,它是頂級 key 的值array。該路徑的值為1

第二個數組包含路徑["array",1],即同一數組的第二個元素,以及值2

第三個數組包含路徑["array",2,"hello"]。該路徑表示hello頂級 key 數組中第三個位置的鍵array。該路徑的值為world

然後是一組三個沒有值的數組,每個數組都表示 、 和 (分別)的最後一部分.array[2].hello.array[2].array流式傳輸。

jq1.6的手冊使用了範例[0,[1]],該範例作為四個數組進行流式傳輸

[[0],0]
[[1,0],1]
[[1,0]]
[[1]]

很難看出這裡發生了什麼,因為只有兩個整數01在數據中,將它們更改為字元串"a""b"我們得到

[[0],"a"]
[[1,0],"b"]
[[1,0]]
[[1]]

同樣,有兩個具有路徑和值的數組,然後是兩個數組,它們終止僅包含 的子數組"b"和頂級數組。

讓這個例子更短,第一個數組簡單地說有一個路徑,[0]即頂級對象必須是一個數組,"a"在第一個位置有一個值。路徑[1,0]表示頂級數組的第二個元素的第一個元素,其值為"b"

要回答您關於為什麼"a"流式傳輸的明確問題[[],"a"]:路徑[]表示不屬於任何其他對像或數組的事物。該路徑的值為"a"。也就是說,您有一個"a"既不是對像也不是數組的一部分。

引用自:https://unix.stackexchange.com/questions/636960