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

在Python中按值搜索API返回的JSON,python,json,Python,Json,我正在使用Python2.7.12访问一个API,它给出了一个JSON响应。JSON如下所示: { "Header": { "GeneratedAt": "2016-07-31T13:42:33", "PeriodA": { "startDate": "20160718", "type": "WEEKLY", "endDate": "20160724" }

我正在使用Python2.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实际返回内容的一个非常精简的版本。

json.loads
为您提供了一个常规的Python嵌套字典,因此类似的内容应该可以工作(假设您想要的数据条目始终是第一个):


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

假定顺序始终相同,您只需通过键访问,也不需要使用JSON。加载请求可以为您处理:

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

我得到了以下错误:回溯(上次的最新调用):文件“C:/Python27/practice1.py”,第35行,totalSales=metric['A']KeyError:'A'>>>非常好,这是一个很好的解决方案,谢谢
js = requests.get(url).json()
for dct in js["Data"][0]['Metrics']:
    if dct.get("name") == "Sales":
        total_sales = dct["values"]["A"]
        break