Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从API解析JSON列表/字典_Python_Json_Python 3.x_Python Requests_Simplejson - Fatal编程技术网

Python 从API解析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':

我开发了一个小型库,并希望用户能够更轻松地从返回的JSON列表/字典中检索数据。我创建了使用请求处理调用的函数。现在假设我调用此函数并传入几个参数:

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高手,加快自己的开发速度也是很有帮助的(尽管我没有),而作为一名新手,想象正在发生的事情可能会更有帮助。