使用 JQ 和 bash 脚本过滤 JSON 请求

使用 JQ 和 bash 脚本过滤 JSON 请求

我正在从 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"
}

如何在代码中操作它们?


我想出的替代方案是:

  1. 创建curl 的输出,对其进行过滤,然后删除。
  2. 发送 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 进行计算。

对于bashshell,您还可以创建数组分配:

eval "$(
    jq -r '@sh "array=(\([.first, .second, .third]))"' file.json
)"

在这里,该jq命令将生成类似 的内容array=('lor' 'em' 'ipsum'),当 进行评估时,将创建使用给定内容bash调用的数组。array

您可以使用该jq语句@sh "array=(\([.[]]))"创建所有键值的数组,假设每个值都是标量。

相关内容