Python 从API解析JSON列表/字典
我开发了一个小型库,并希望用户能够更轻松地从返回的JSON列表/字典中检索数据。我创建了使用请求处理调用的函数。现在假设我调用此函数并传入几个参数:Python 从API解析JSON列表/字典,python,json,python-3.x,python-requests,simplejson,Python,Json,Python 3.x,Python Requests,Simplejson,我开发了一个小型库,并希望用户能够更轻松地从返回的JSON列表/字典中检索数据。我创建了使用请求处理调用的函数。现在假设我调用此函数并传入几个参数: precip = precipitation_obs(stid='kfnl', start='201504261800', end='201504271200', units='precip|in') 这将返回以下JSON: { 'STATION': [ { 'ELEVATION': '5016', 'ID':
precip = precipitation_obs(stid='kfnl', start='201504261800', end='201504271200', units='precip|in')
这将返回以下JSON:
{ 'STATION': [ { 'ELEVATION': '5016',
'ID': '192',
'LATITUDE': '40.45',
'LONGITUDE': '-105.01667',
'MNET_ID': '1',
'NAME': 'Fort Collins/Loveland, Fort Collins-Loveland '
'Municipal Airport',
'OBSERVATIONS': { 'count_1': 6,
'ob_end_time_1': '2015-04-27T00:55:00Z',
'ob_start_time_1': '2015-04-26T18:55:00Z',
'total_precip_value_1': 0.13,
'vids case4': ['39', '51', '40', '52']},
'STATE': 'CO',
'STATUS': 'ACTIVE',
'STID': 'KFNL',
'TIMEZONE': 'US/Mountain'}],
'SUMMARY': { 'METADATA_RESPONSE_TIME': '5.22613525391 ms',
'NUMBER_OF_OBJECTS': 1,
'RESPONSE_CODE': 1,
'RESPONSE_MESSAGE': 'OK',
'TOTAL_TIME': '57.6429367065 ms'}}
现在,我希望用户能够深入浏览字典,但STATION是一个列表,需要我执行以下操作:
output = precip['STATION'][0]['OBSERVATIONS']['ob_start_time_1']
print(output)
# returns 2015-04-26T18:55:00Z
其中我必须包括[0]以避免:
TypeError: list indices must be integers, not str
这有什么关系吗?把[0]加进去真的会让事情变得更糟。甚至每次都要指定['STATION']都有点麻烦。我应该使用simpleJSON模块在这里提供帮助吗?任何让这更容易的建议都会很好,谢谢
在那里添加[0]
真的会让事情变得更糟。甚至每次都要指定['STATION']
都有点麻烦
所以只需将precip['STATION'][0]存储在变量中:
>>> precip0 = precip['STATION'][0]
现在,您可以重复使用它:
>>> precip0['OBSERVATIONS']['ob_start_time_1']
2015-04-26T18:55:00Z
如果您知道API总是只返回一个站点,并且除了该站点的数据之外,您永远不会需要任何其他内容,那么您可以将其放入包装器函数中:
def precipitation_obs(stid, start, end, units):
# your existing code, which assigns something to result
return result['STATION'][0]
如果你担心这里的“效率”,别担心。首先,这并不是复制任何东西,它只是对已经存在的同一个对象进行另一次引用,这需要不到一微秒的时间,并且浪费大约8字节。事实上,它可以节省内存,因为如果不存储整个dict,只存储子dict,Python可以对结构的其余部分进行垃圾收集。而且,更重要的是,在(1)您的代码正常工作和(2)您知道这是一个瓶颈之前,这种微观优化首先不值得担心
我应该使用simpleJSON模块在这里提供帮助吗 你为什么认为这会有帮助?作为: simplejson是Python 2.6和Python 3.0中包含的json库的外部维护开发版本,但保持了与Python 2.5的向后兼容性 换句话说,它要么是与stdlib中已有的代码相同的代码,要么是该代码的旧版本
有时,一个不同的库,比如,可能会有所帮助,例如,如果JSON结构太大,以至于您无法将整个内容解析到内存中,或者太复杂,以至于更容易用SAX风格描述您想要的东西。但这与此无关。如果这是您的API,为什么不简化输出?如果只有一个电台,那么不要使用列表。如果访问station元素很常见,并且只有一个station,那么不要使用嵌套结构,而是将所有键移动到顶级对象,等等。No
simplejson
在这里没有帮助,因为它只是将JSON解析为相应的Python结构。相反,如果可以有多个station,您无法摆脱[0]
步骤,因为如果有3个站点,您需要能够访问#0、#1和#2。您可以将该列表更改为键入的dict,例如,每个电台的'STID'
值(因此它将是precip['station']['KFNL']['ob'start\u time\u 1']
),但您无法摆脱它。感谢您的全面回复。我编写的第一段代码涉及JSON/进行API调用。我很感激这个教训@jclark754:我的一位老同事曾经使用过一个Firefox扩展。它将JSON文档显示为一棵树,允许您单击任意位置,引导您通过从那里到顶部的路径,然后为您提供索引和/或迭代步骤的代码(JavaScript,不是Python…但类似)。不幸的是,我记不起它叫什么了,但你可能想找类似的东西。他发现,即使作为一名JS高手,加快自己的开发速度也是很有帮助的(尽管我没有),而作为一名新手,想象正在发生的事情可能会更有帮助。