在Python中按值返回的JSON返回值

问题描述:

我正在访问使用Python 2.7.12的API,它提供了JSON响应。该JSON看起来是这样的:在Python中按值返回的JSON返回值

{ 
    "Header": { 
     "GeneratedAt": "2016-07-31T13:42:33", 
     "PeriodA": { 
      "startDate": "20160718", 
      "type": "WEEKLY", 
      "endDate": "20160724" 
     } 
    }, 
    "Data": [ 
     { 
      "Metrics": [ 
       { 
        "name": "Sales", 
        "values": { 
         "A": "823456.32", 
         "B": "" 
        }, 
        "id": "TL_TOTAL_SALES" 
       }, 
       { 
        "name": "Orders", 
        "values": { 
         "A": "1230", 
         "B": "" 
        }, 
        "id": "TL_TOTAL_ORDERS" 
       }, 
      ], 
      "label": "Commerce Metrics" 
     }, 
    ] 
} 

我使用Python解析JSON作为一个字符串,然后我需要搜索的JSON字符串,并提取特定指标的值,所以在这种情况下,我想要的度量“Sales”的值。

到目前为止我的代码:

import json, requests 

url = "https://something.com/blah-blah-blah/" 
r = requests.get(url) 
data = json.loads(r.text) 
print json.dumps(data, indent=4) 

我想继续做的是价值“A”从一个变量称为totalSales“销售”存储,但需要知道查询的最佳实践和从这样的JSON响应中提取单个数据值,这是从API返回的实际版本。

。假定的顺序总是你只是键访问相同的,你也不需要使用json.loads作为请求可以处理你:

js = requests.get(url).json() 

total_sales = js["Data"][0]['Metrics'][0]["values"]["A"] 

print(total_sales) 

如果顺序可以不同,只是重复,直到你找到那么字典破解:

js = requests.get(url).json() 
for dct in js["Data"][0]['Metrics']: 
    if dct.get("name") == "Sales": 
     total_sales = dct["values"]["A"] 
     break 
+0

优秀,工作和优雅的解决方案,谢谢 – megatron77

+0

没有问题,您的欢迎。 –

json.loads为您提供了一个常规的Python嵌套字典,所以这样的事情应该工作(假设你想要的数据条目始终是第一位):

for metric in data['Data'][0]['Metrics']: 
    if metric['name'] == "Sales": 
     totalSales = metric['values']['A'] 

需要注意的是,因为JSON对对象语法发生匹配词典的Python语法,如果您想要实验,可以将其粘贴到Python提示符中。

+0

我得到了以下错误:回溯(最近通话最后一个): 文件“C:/Python27/practice1.py” 35行,在 totalSales =公制['A'] KeyError: 'A' >>> – megatron77

+0

是的,我已经修复了。你可以再试一次吗? –

+1

是的,这个作品现在太多了,也谢谢:-) – megatron77