如何使用Bash从JSON获取下一个URL

时间:2019-03-27 16:55:33

标签: bash curl

我创建了一个简单的脚本来存储来自第三方API的响应

请求就是这样。

https://externalservice.io/orders?key=password&records=50&offset=0

响应如下:

{
  "results": [
    {
      "engagement": {
        "id": 29090716,
        "portalId": 62515,
        "active": true,
        "createdAt": 1444223400781,
        "lastUpdated": 1444223400781,
        "createdBy": 215482,
        "modifiedBy": 215482,
        "ownerId": 70,
        "type": "NOTE",
        "timestamp": 1444223400781
      },
    },
  ],
  "hasMore": true,
  "offset": 4623406
}

如果有一个 hasMore 属性,我需要读取offset值以获取下一组记录。

现在,我已经创建了一个脚本,该脚本只是在估计的记录数上循环(我相信有),并且认为增加偏移量是可行的,但事实并非如此,因为偏移量不是增量的。

#!/bin/bash

for i in {1..100}; do
    curl -s "https://externalservice.io/orders?key=password&records=50&offset=$i" >>outfile.txt 2>&1
done

有人可以解释我如何继续阅读脚本offset直到hasMore=false吗?

2 个答案:

答案 0 :(得分:0)

您可以使用jq实用程序从json读取值:

$ jq -r ".hasMore" outfile

true

这是您可以使用的:

more="true"
offset=0
while [ $more = "true" ]; do
    echo $offset
    response=$(curl -s "https://example.com/orders?offset=$offset")
    more=$(echo $response | tr '\r\n' ' ' | jq -r ".hasMore")
    offset=$(echo $response | tr '\r\n' ' ' | jq -r ".offset")
done

答案 1 :(得分:0)

您可以使用 jq 实用程序从您的 json 响应中提取特定属性:

$ jq -r ".hasMore" outfile

true

jq 需要完全有效的 json 输入,否则会打印错误。 最常见的错误是将echo json 存储在变量中。一个错误,因为 echo 将解释您的 json 中所有转义的换行符,并将在值内发送未转义的换行符,导致 jq 抛出 parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 消息。

为了避免修改 json(并避免错误),我们需要使用 printf 而不是 echo

这是不破坏json内容的解决方案:

more="true"
offset=0
while [ $more = "true" ]; do
    echo $offset
    response=$(curl -s "https://example.com/orders?offset=$offset")
    more=$(printf "%s\n" "$response" | jq -r ".hasMore")
    offset=$(printf "%s\n" "$response" | jq -r ".offset")
done