2017-11-21 1 views
1

와 JSON의 여러 페이지를 가져 오기, 내가 꽤API를 호출 할 때 JQ

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

인쇄 할 수있는 JSON을 반환하고 다음 샘플 출력입니다. 두 페이지의 레코드 (총 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 
    }... 
+0

수 없습니다. 'jq'는 HTTP에 대해 아무것도 모릅니다. 'curl'은 데이터를 가져옵니다. 'jq'는'curl'의 출력을 처리합니다. – chepner

+0

하나 이상의 페이지를 요청할 수있는 방법이 없는지 API를 확인 했습니까? 또는 페이지 매김을 모두 피할 수 있습니까? – peak

답변

1

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 배열을 가져옵니다.

관련 문제