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"}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"オブジェクトも配列でもないセクションがあります。

おすすめ記事