jq --stream 手册页中路径和叶数组的定义是什么意思

jq --stream 手册页中路径和叶数组的定义是什么意思

jq手册页中,--stream选项说:

以流方式解析输入,输出路径和叶值的数组(标量和空数组或空对象)。例如,"a"变为[[],"a"]、 并[[],"a",["b"]]变为[[0],[]][[1],"a"]、 和[[1,0],"b"]

我想知道“路径和叶值数组”的含义以及为什么输入表示形式会被转换为:

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

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

我一直在审查像列表表示这样的树,但它并不相似。

答案1

jq这对于1.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],即数组的第一个元素,它是顶级键的值array。该路径的值为1

第二个数组包含路径["array",1](即同一数组的第二个元素)和值2

第三个数组包含路径["array",2,"hello"]。该路径表示hello顶级 key 的数组第三个位置的键array。该路径的值为world

接下来是一组三个没有值的数组,每个数组都表示 、 和 (分别)的最后一部分.array[2].hello.array[2].array流式传输。

1.6的手册jq使用了示例[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"既不属于对象也不属于数组的部分。

相关内容