
私は書くことができます
> 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"
きれいです。書くだけでも問題は解決しますが、レイヤーが発生することもあります。内部からを削除する正しい方法は何ですか?jq
null
select(.a != null)
{}
null
jq
答え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ドキュメントに含めるためにデータを適切にエンコードします。
jo
2番目の例JSONは、次の2つの呼び出しを使用して作成できます。
jo a=arbiter b=brisk 'c[]'=cloak 'c[]'=conceal
jo a=astound b=bistro 'c[]'=confer 'c[]'=consider
答え2
この回答は更新前に問題を解決します。
まあ、それはとても些細なことです。これを減らすために、Pythonの素晴らしいJSONライブラリやawkやsedの一般性は必要ありません。次のように書くだけで十分です。
> 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"