JQを使用したJSON行配列の平面化

JQを使用したJSON行配列の平面化

私は書くことができます

> echo '{"a": "arbiter", "b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'
"arbiter"
"brisk"
"astound"
"bistro"

しかし、私がそうするなら

> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c'

わかりました。

"arbiter"
"brisk"
[
    "cloak",
    "conceal"
]
"astound"
"bistro"
[
    "confer",
    "consider"
]

c代わりに配列をどのように平坦化するのですか?

"arbiter"
"brisk"
"cloak",
"conceal"
"astound"
"bistro"
"confer",
"consider"

修正する

板の安全性は多くの現代言語で非常に広く使用され、当然と考えられているので、上記の質問が不完全であると仮定することが適切です。値が欠落している場合を処理する方法を知る必要があります。

値の1つがある場合null

> echo '{"b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'

出力からnull値を取得します。

null
"brisk"
"astound"
"bistro"

これがおそらく私たちが望むものです。パイプラインに2番​​目のステップを追加できますが(除外しないように注意してください)、それ自体を除外する方が"null"きれいです。書くだけでも問題は解決しますが、レイヤーが発生することもあります。内部からを削除する正しい方法は何ですか?jqnullselect(.a != null){}nulljq

ベストアンサー1

表現jq方式

[.a, .b, .c]

入力オブジェクトから必要なすべての要素を抽出して配列に配置します。これらの要素の一部は配列である可能性があるため、すべて平坦化する必要があります。

[.a, .b, .c] | flatten

入力オブジェクトの場合

{
  "a": "arbiter",
  "b": "brisk",
  "c": [
    "cloak",
    "conceal"
  ]
}

これで配列が作成されます。

[
  "arbiter",
  "brisk",
  "cloak",
  "conceal"
]

2番目のオブジェクトと似ていますが、別々の配列を取得します。

これら2つの配列を1つにまとめるには、単にデータを渡すだけですが、データを.[]書き込む簡単な方法はflatten | .[]次のとおりですflatten[]。これを使って、

[.a, .b, .c] | flatten[]

要約:

echo '...as in the question...' |
jq '[.a, .b, .c] | flatten[]'

値も削除するには、に基づいてフィルタリングするか、null値抽出を使用するか、以前select(. != null)[.a//empty,.b//empty,.c//emtpy]フィルタリングします。map(.//empty)flatten[]


コメント:入力JSONは、echo質問の簡単な項目を使用して生成されます。ただし、コマンドラインからJSONを正しく生成するには、次のツールを使用することをお勧めします。このツールjoは、JSONドキュメントに含めるためにデータを適切にエンコードします。

jo2番目の例JSONは、次の2つの呼び出しを使用して作成できます。

jo a=arbiter b=brisk  'c[]'=cloak  'c[]'=conceal
jo a=astound b=bistro 'c[]'=confer 'c[]'=consider

おすすめ記事