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"}
2つの配列にストリーミングされます。
[["key"],"value"]
[["key"]]
最初のストリーム配列はパスと値で構成されます。パスは、["key"]
キーが最上位キーであるかのように機能します。このパスの値はです"value"
。
2番目の配列にはパスのみがあり、値はなく、このストリームオブジェクトの終わりを表します(出力ストリームにはこのオブジェクトのキーはありません)。
他の例:
複合オブジェクト
{
"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
。
2番目の配列には、パス["array",1]
(つまり同じ配列の2番目の要素)と値が含まれます2
。
3番目の配列にはパスが含まれています["array",2,"hello"]
。パスは、hello
最上位キー配列の3番目の位置にあるキーを表しますarray
。このパスの値はですworld
。
以下は、値のない3つの配列のセットです。それぞれは、ストリーミングされた、および.array[2].hello
(それぞれ)の最後の部分を表します。.array[2]
.array
1.6 マニュアルでは、4 つの配列にストリーミングされるjq
例を使用します。[0,[1]]
[[0],0]
[[1,0],1]
[[1,0]]
[[1]]
0
データには整数の合計が2つしかないため、ここで何が起こっているのかを確認するのは少し難しいです。私たちが得る1
文字列の合計に変更することをお勧めします。"a"
"b"
[[0],"a"]
[[1,0],"b"]
[[1,0]]
[[1]]
繰り返しますが、パスと値を持つ2つの配列があり、その後にのみ含まれるサブ配列と最上位"b"
配列を終了する2つの配列があります。
この例を短くしておけば、最初の配列はパスがあると言います。[0]
つまり、最上位オブジェクトは配列でなければならず、"a"
最初の位置に値が必要です。パスは、[1,0]
値がある最上位配列の2番目の要素のうちの1番目の要素を表します"b"
。
"a"
ストリーミングの理由に関する明確な質問に答えるには、[[],"a"]
パスは[]
他のオブジェクトや配列に属していないことを示します。このパスの値はです"a"
。つまり、"a"
オブジェクトも配列でもないセクションがあります。