2017-11-21 4 views
1

Wenn ein API-Aufruf, ich bin ein Json zurück, die unter mitFetch mehrere Seiten von json mit jq

curl "https://mywebsite.com/api/cars.json&page=1" | jq '.' 

gedruckt werden ziemlich kann, ist ein Beispiel für die Ausgabe. Da es zwei Seiten mit Datensätzen gibt (insgesamt 112 Einträge und nur 100 Einträge pro Seite), welchen Befehl kann ich in jq verwenden, um beide Datenseiten sofort abzurufen?

{ 
    "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 
    }... 
+0

Sie können nicht; 'jq' weiß nichts über HTTP. 'curl' ruft die Daten ab; 'jq' verarbeitet nur die Ausgabe von' curl'. – chepner

+0

Haben Sie die API überprüft, um festzustellen, ob es eine Möglichkeit gibt, mehr als eine einzelne Seite anzufordern? Oder können Sie Paginierung überhaupt vermeiden? – peak

Antwort

1

jq ruft keine Seiten ab. Sie müssen Seiten mit mehreren curl-Aufrufen abrufen und dann die JSON-Ausgaben kombinieren. Zum Beispiel könnten Sie einen JSON-Array der kombinierten .item Eigenschaften erhalten:

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

Wenn Sie die Anzahl der Seiten im Voraus nicht wissen, was Sie brauchen werden, dann müssen Sie ein wenig härter arbeiten aber es ist natürlich möglich.

Holen Sie sich die gesamten Einträge aus der ersten Seite:

total=$(curl "$url&page=1" | jq .total_entries) 

Berechnen Sie die Anzahl der Seiten:

((pages = total/100)) 

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

Und dann können Sie eine Schleife schreiben die Ergebnisse Seite für Seite zum Download, erzeugen Der jq Befehl .[0].items + ... + .[n].items und jq damit aufrufen, um das kombinierte JSON-Array zu erhalten.