【发布时间】:2015-04-27 19:54:56
【问题描述】:
我开发了一个小型库,并希望让用户更轻松地从返回的 JSON 列表/字典中检索数据。我创建了使用requests 处理调用的函数。现在假设我调用这个函数并传入一些参数:
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 模块来提供帮助吗?任何使这更容易的提示都会很棒,谢谢!
【问题讨论】:
-
如果这是您的 API,那为什么不简化输出呢?是否只有一个站,然后不要使用列表。如果访问站元素很常见,并且只有一个站,请不要使用嵌套结构,而是将所有键移动到顶级对象等。
-
No
simplejson在这里没有帮助,因为它只是将 JSON 解析为相应的 Python 结构。 -
反之,如果有可以多于一个站,你不能摆脱
[0]这一步,因为如果有3个站,你需要能够访问#0、#1 和#2。您可以将该列表更改为由每个电台的'STID'值(因此它将是precip['STATION']['KFNL']['OBSERVATIONS']['ob_start_time_1'])作为键的字典,但您无法摆脱它。
标签: python json python-3.x python-requests simplejson