在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]]
看到这里发生的事情有点困难,因为数据中只有两个整数0
和1
,打赌将它们更改为字符串"a"
和"b"
,我们得到
[[0],"a"]
[[1,0],"b"]
[[1,0]]
[[1]]
同样,有两个带有路径和值的数组,然后是两个终止仅包含 的子数组的数组"b"
,以及顶级数组。
保持这个例子更短,第一个数组只是说有一个路径,[0]
即顶级对象必须是一个数组,并且"a"
第一个位置有一个值。该路径[1,0]
表示顶级数组的第二个元素的第一个元素,其值为"b"
。
要回答关于为什么"a"
流式传输的明确问题[[],"a"]
:路径[]
表示不属于任何其他对象或数组的事物。该路径的值为"a"
。也就是说,您有一个"a"
既不属于对象也不属于数组的部分。