如何在 Python 2.7 中高效地解析具有多个键的 JSON 数据?

How to efficiently parse JSON data with multiple keys in Python 2.7?

我正在编写一个脚本,用于检查我所在弗吉尼亚州城市的 CVS COVID 疫苗可用性。我已经成功地获得了我正在寻找的数据,但我的代码在某些地方是硬编码的。我特别要求帮助改进我在下面第 1 和第 2 方面的代码:

JSON 文件可以在这里找到: https://www.cvs.com//immunizations/covid-19-vaccine.vaccine-status.VA.json?vaccineinfo

  1. 我正在尝试访问 responsePayloadData 键中的数据。我唯一能弄清楚如何做到这一点的方法就是让它成为唯一的关​​键。出于这个原因,我删除了另一个关键 responseMetaData:
#remove the key that we don't need
del obj['responseMetaData']
  1. 我也不确定如何在不对数据中我知道的城市数量进行硬编码的情况下动态循环遍历 VA 项目:
for x, y in obj.items():
   for a in range(34):

完整代码如下:

    import requests
    import json
    import time
    from datetime import datetime
    import urllib2
    try: 
        import indigo
    except:
        pass
    
    strAvail = "False"
    strAvailCity = "None"
    
    try:
        # download raw json object from CVS Virginia Website
        url = "https://www.cvs.com//immunizations/covid-19-vaccine.vaccine-status.VA.json?vaccineinfo"
        data = urllib2.urlopen(url).read().decode()
    except urllib2.HTTPError, err:
            return {"error": err.reason, "error_code": err.code} 
    
    # parse json object
    obj = json.loads(data)
    
    # remove the key that we don't need
    del obj['responseMetaData']
    
    # loop through the JSON dictionary and check availability
    # status options: {"Fully Booked", "Available"}
    for x, y in obj.items():
        for a in range(34):
            # print('City: ' + y['data']['VA'][a]['city'])
            # print('Total Available: ' + y['data']['VA'][a]['totalAvailable'])
            # print('Percent Available: ' + y['data']['VA'][a]['pctAvailable'])
            # print('Status: ' + y['data']['VA'][a]['status'])
            # print("------------------------------")
            # If there is availability anywhere in the state, take some action. 
            if y['data']['VA'][a]['status'] == "Available":
                strAvail = True
                strAvailCity = y['data']['VA'][a]['city']
    
    # Log timestamp for this check to the JSON
    now = datetime.now()
    strDateTime = now.strftime("%m/%d/%Y %I:%M %p")

编辑:由于 JSON 在美国以外地区不可用。我把它贴在下面:

{"responsePayloadData":{"currentTime":"2021-02-11T14:55:00.470","data":{"VA":[{"totalAvailable":"1","city":"ABINGDON","state":"VA","pctAvailable":"0.19%","status":"Fully Booked"},{"totalAvailable":"0","city":"ALEXANDRIA","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"ARLINGTON","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"BEDFORD","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"BLACKSBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"CHARLOTTESVILLE","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"CHATHAM","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"CHESAPEAKE","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"1","city":"DANVILLE","state":"VA","pctAvailable":"0.19%","status":"Fully Booked"},{"totalAvailable":"2","city":"DUBLIN","state":"VA","pctAvailable":"0.39%","status":"Fully Booked"},{"totalAvailable":"0","city":"FAIRFAX","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"FREDERICKSBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"GAINESVILLE","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"HAMPTON","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"HARRISONBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"LEESBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"LYNCHBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"MARTINSVILLE","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"MECHANICSVILLE","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"MIDLOTHIAN","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},
{"totalAvailable":"0","city":"NEWPORT NEWS","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"NORFOLK","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"PETERSBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"PORTSMOUTH","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"RICHMOND","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"ROANOKE","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},
{"totalAvailable":"0","city":"ROCKY MOUNT","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"STAFFORD","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"SUFFOLK","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},
{"totalAvailable":"0","city":"VIRGINIA BEACH","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"WARRENTON","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"WILLIAMSBURG","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"WINCHESTER","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"},{"totalAvailable":"0","city":"WOODSTOCK","state":"VA","pctAvailable":"0.00%","status":"Fully Booked"}]}},"responseMetaData":{"statusDesc":"Success","conversationId":"Id-beb5f68730b34e6aa3bbc1fd927ea12b","refId":"Id-b4a7256078789eb59b8912b4","operation":"getInventorybyCity","statusCode":"0000"}}

关于问题1,可以通过key访问数据。您不需要删除另一个密钥:

payload = obj['responsePayloadData']

对于第二个问题,您可以遍历与 obj['data']['VA']:

关联的列表中的项目
for city in payload['data']['VA']:
    print(city)
{'city': 'ABINGDON',
 'pctAvailable': '0.19%',
 'state': 'VA',
 'status': 'Fully Booked',
 'totalAvailable': '1'}
{'city': 'ALEXANDRIA',
 'pctAvailable': '0.00%',
 'state': 'VA',
 'status': 'Fully Booked',
 'totalAvailable': '0'}
...