在Python中按值从API返回的JSON搜索

时间:2016-07-31 14:43:07

标签: python json

我正在使用Python 2.7.12访问API,它提供了JSON响应。 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)

我想要做的是将“Sales”中的值“A”存储在名为totalSales的变量中,但是需要知道从这样的JSON响应中查询和提取单个数据值的最佳实践,这是实际从API返回的非常精简的版本。

2 个答案:

答案 0 :(得分:4)

假设订单总是与您只是通过密钥访问相同,您也不需要使用json.loads,因为请求可以为您处理:

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

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

print(total_sales)

如果订单可能不同,只需迭代直到找到dict然后中断:

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

答案 1 :(得分:2)

json.loads为您提供了一个常规的Python嵌套字典,所以这样的东西应该可以工作(假设您想要的数据输入始终是第一个):

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

请注意,因为JSON的对象语法恰好与Python的字典语法相匹配,所以如果要进行实验,可以将其粘贴到Python提示中。