我正在从 Twitch 请求 JSON,其中包含: 我为函数发送的输入在curl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1
哪里。$1
现在我的目标是通过在curl之后通过管道来过滤JSON:| jq '.stream.channel.something'
我试图通过jq过滤获取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
它来创建三个分配,您可以在 shell 中安全地评估它们:
eval "$(
jq -r '
@sh "first=\(.first)",
@sh "second=\(.second)",
@sh "third=\(.third)"' file.json
)"
运算@sh
符 injq
将在表单上输出赋值,first='lor'
供 shell 进行计算。
对于bash
shell,您还可以创建数组分配:
eval "$(
jq -r '@sh "array=(\([.first, .second, .third]))"' file.json
)"
在这里,该jq
命令将生成类似 的内容array=('lor' 'em' 'ipsum')
,当 进行评估时,将创建使用给定内容bash
调用的数组。array
您可以使用该jq
语句@sh "array=(\([.[]]))"
创建所有键值的数组,假设每个值都是标量。