使用OFFSET在Python中迭代JSON

时间:2016-03-12 02:13:23

标签: python json api rest hubspot

我正在尝试使用HubSpot CRM API来获取“所有交易”。

API端点是:https://api.hubapi.com/deals/v1/deal/all?hapikey=demo

返回的JSON看起来像这样......

{
    "deals": [
        {
            "portalId": 62515,
            "dealId": 18039629,
            "isDeleted": false,
            "associations": {
                "associatedVids": [],
                "associatedCompanyIds": [],
                "associatedDealIds": []
            },
            "properties": {
                "dealname": {
                    "value": "Company",
                    "timestamp": 1457040864519,
                    "source": "API",
                    "sourceId": null
                },
                "amount": {
                    "value": "10",
                    "timestamp": 1457040864519,
                    "source": "API",
                    "sourceId": null
                },
                "closedate": {
                    "value": "",
                    "timestamp": 1457040864519,
                    "source": "API",
                    "sourceId": null
                },
                "hubspot_owner_id": {
                    "value": "11626092",
                    "timestamp": 1457046177648,
                    "source": "SALESFORCE",
                    "sourceId": null
                },
                "hs_lastmodifieddate": {
                    "value": "1457046177662",
                    "timestamp": 1457046177662,
                    "source": "CALCULATED",
                    "sourceId": null
                },
                "hubspot_owner_assigneddate": {
                    "value": "1457046177648",
                    "timestamp": 1457046177648,
                    "source": "SALESFORCE",
                    "sourceId": null
                },
                "num_associated_contacts": {
                    "value": "0",
                    "timestamp": 0,
                    "source": "CALCULATED",
                    "sourceId": null
                },
                "hs_createdate": {
                    "value": "1457040864535",
                    "timestamp": 1457040864535,
                    "source": null,
                    "sourceId": null
                },
                "createdate": {
                    "value": "1457040864535",
                    "timestamp": 1457040864535,
                    "source": null,
                    "sourceId": null
                },
                "hs_salesforceopportunityid": {
                    "value": "00628000007nRyuAAE",
                    "timestamp": 1457046177648,
                    "source": "SALESFORCE",
                    "sourceId": null
                }
            },
            "imports": []
        },
        {
            "portalId": 62515,
            "dealId": 18040854,
            "isDeleted": false,
            "associations": {
                "associatedVids": [],
                "associatedCompanyIds": [],
                "associatedDealIds": []
            },
            "properties": {
                "dealname": {
                    "value": "5678",
                    "timestamp": 1457042290572,
                    "source": "API",
                    "sourceId": null
                },
                "amount": {
                    "value": "750000.0",
                    "timestamp": 1457042290572,
                    "source": "API",
                    "sourceId": null
                },
                "closedate": {
                    "value": "",
                    "timestamp": 1457042290572,
                    "source": "API",
                    "sourceId": null
                },
                "hs_lastmodifieddate": {
                    "value": "1457042290592",
                    "timestamp": 1457042290592,
                    "source": "CALCULATED",
                    "sourceId": null
                },
                "num_associated_contacts": {
                    "value": "0",
                    "timestamp": 0,
                    "source": "CALCULATED",
                    "sourceId": null
                },
                "hs_createdate": {
                    "value": "1457042290592",
                    "timestamp": 1457042290592,
                    "source": null,
                    "sourceId": null
                },
                "createdate": {
                    "value": "1457042290592",
                    "timestamp": 1457042290592,
                    "source": null,
                    "sourceId": null
                }
            },
            "imports": []
        }
    ],
    "hasMore": true,
    "offset": 1467187
}

我理解,如果hasMore==true,那么您应该抓住offset并将其包含在另一个API调用中:https://api.hubapi.com/deals/v1/deal/all?hapikey=demo&offset=1467187

然后继续这样做,直到hasMore==false

我使用以下代码从API中提取第一个JSON块:

import requests

url = "https://api.hubapi.com/deals/v1/deal/all"

querystring = {"hapikey":"demo"}

headers = {
    'cache-control': "no-cache"
    }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)

所以...我的问题是,现在我得到了我的JSON,我该如何:

1)阅读一大块JSON
2)如果hasMore==true那么再去做#1 3)ElseIf hasMore==false然后将上述#1的所有迭代中的所有JSON组合成一个大的JSON
4)从#3

返回值

请帮忙吗?

1 个答案:

答案 0 :(得分:3)

工作解决方案

import json
import requests

url = "https://api.hubapi.com/deals/v1/deal/all"

querystring = {"hapikey":"demo"}

headers = {
    'cache-control': "no-cache"
    }

all_deals = []

response = requests.request("GET", url, headers=headers, params=querystring).json()

for deal in response['deals']:
    all_deals.append(deal)

hasMore = response['hasMore']
offset = response['offset']

while hasMore:

    querystring = {
        "hapikey":"demo",
        "offset":offset
        }
    response = requests.request("GET", url, headers=headers, params=querystring).json()

    for deal in response['deals']:
        all_deals.append(deal)

    hasMore = response['hasMore']
    offset = response['offset']

print(json.dumps(all_deals))