使用jq获取多个json页面

3
当调用一个API时,返回的是一个可以使用

进行漂亮打印的json格式。
curl "https://mywebsite.com/api/cars.json&page=1" |  jq '.' 

以下是一个样例输出。由于有两页记录(共112个条目,每页仅显示100个条目),我可以在jq中使用什么命令立即获取这两页数据?
{
  "current_page": 1,
  "per_page": 100,
  "total_entries": 112,
  "items": [
    {
      "id": 1,
      "name": "vehicleA",
      "state": "available",
      "charge": 100
    },
    {
      "id": 2,
      "name": "vehicleB",
      "state": "available",
      "charge": 75
    },
    {
      "id": 3,
      "name": "vehicleB",
      "state": "available",
      "charge": 50
    }...

你不能这样做;jq 对 HTTP 一无所知。curl 获取数据,而 jq 只是处理 curl 的输出。 - chepner
你是否检查了API,看看是否有一种方法可以请求多个页面?或者也许你可以完全避免分页? - peak
2个回答

3

jq 无法获取页面。您需要使用多个 curl 调用来获取页面,然后组合 JSON 输出。 例如,您可以获取一个组合了 .item 属性的 JSON 数组:

url=https://mywebsite.com/api/cars.json
jq -s '.[0].items + .[1].items' <(curl "$url&page=1" | jq .) <(curl "$url&page=2" | jq .)

如果您事先不知道需要多少页,则需要进行一些更努力的工作,但这当然是可能的。
从第一页获取总条目数:
total=$(curl "$url&page=1" | jq .total_entries)

计算页面数量:

((pages = total / 100))

if ((total % 100 > 0)); then
    ((pages++))
else

然后你可以编写一个循环来逐页下载结果页面,生成 jq 命令 .[0].items + ... + .[n].items 并使用它调用 jq 来获取合并的 JSON 数组。


0
如果您可以下载所有页面并创建所有条目的数组(类似于上面@janos的答案),那么您就不需要计算生成jq命令。相反,您可以使用flatten,如下所示:jq '[.[].items] | flatten'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接