
Twitch に次の JSON をリクエストしています: 関数に送信する入力はcurl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1
どこにありますか。$1
今私が目指しているのは、これを curl の後にパイプして JSON をフィルターすることです。jq| jq '.stream.channel.something'
フィルター処理を通じて 3 つの異なる文字列値を取得しようとしていますが、次のレベルまで取得できます。
{
"first": "lor"
"second": "em"
"third": "ipsum"
}
コード内でそれらを操作する方法はありますか?
私が思いついた代替案は次のとおりです。
- curl の出力を作成し、フィルタリングしてから削除します。
- 3 つの cURL リクエストを送信します (無駄なパフォーマンスの浪費でしょうか?)。
答え1
前述したように、私は json や jq についてあまり詳しくありませんが、次のサンプル出力を jq で解析できませんでした。
{
"first": "lor"
"second": "em"
"third": "ipsum"
}
parse error: Expected separator between values at line 3, column 12
そこで入力を次のように変更しました:
{
"stream" : {
"channel" : {
"something" : {
"first": "lor",
"second": "em",
"third": "ipsum"
}
}
}
}
... jq の呼び出しから収集した情報に基づきます。 curl コマンドの出力と似ていることを願っています。
もしそうなら、次のシーケンスで望みの結果が得られそうです:
# this is just your original curl command, wrapped in command substitution,
# in order to assign it to a variable named 'output':
output=$(curl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1)
# these three lines take the output stream from above and pipe it to
# separate jq calls to extract the values; I added some pretty-printing whitespace
first=$( echo "$output" | jq '.["stream"]["channel"]["something"]["first"]' )
second=$(echo "$output" | jq '.["stream"]["channel"]["something"]["second"]')
third=$( echo "$output" | jq '.["stream"]["channel"]["something"]["third"]' )
結果:
$ echo $first
"lor"
$ echo $second
"em"
$ echo $third
"ipsum"
答え2
ファイルが有効な JSON であると仮定します (質問のデータは有効ではありません)。
{
"first": "lor",
"second": "em",
"third": "ipsum"
}
jq
これから 3 つの割り当てを作成し、シェルで安全に評価することができます。
eval "$(
jq -r '
@sh "first=\(.first)",
@sh "second=\(.second)",
@sh "third=\(.third)"' file.json
)"
演算子@sh
in は、シェルが評価するためのjq
割り当てをフォームに出力します。first='lor'
シェルの場合はbash
、配列の割り当てを作成することもできます。
eval "$(
jq -r '@sh "array=(\([.first, .second, .third]))"' file.json
)"
ここで、jq
コマンドは のようなものを生成しarray=('lor' 'em' 'ipsum')
、 によって評価されると、指定された内容で とbash
呼ばれる配列が作成されます。array
各値がスカラーであると仮定すると、このjq
ステートメントを使用して@sh "array=(\([.[]]))"
すべてのキーの値の配列を作成できます。