2016-07-31 2 views
2

Я получаю доступ к API с использованием Python 2.7.12, который дает ответ JSON. JSON выглядит примерно так:Поиск JSON возвращается из API по значению в Python

{ 
    "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" 
     }, 
    ] 
} 

Я разбор JSON в виде строки с помощью Python, а затем мне нужно искать строку JSON и извлекать значения определенного показателя, поэтому в данном случае я хочу значения метрики «Продажи».

Мой код до сих пор:

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) 

То, что я хочу пойти на сделать, это сохранить значение «А» от «Продажи» в переменной называется TotalSales, но нужно знать, что лучшие практики в области запросов и извлечение отдельных значений данных из ответа JSON вроде этого, это очень урезанная версия того, что фактически возвращается из API.

ответ

4

Предположив заказ всегда то же самое вы только доступ по ключу, вы также не должны использовать 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

Без проблем, ваш прием. –

2

json.loads дает регулярный Python вложенному словарь, так что-то подобное должно работать (при условии ввода данных вы хотите всегда первая один):

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

Обратите внимание, что, так как синтаксис JSON для объектов происходит с сопоставьте синтаксис Python для словарей, вы можете просто вставить его в приглашение Python, если хотите поэкспериментировать.

+0

я получил следующее сообщение об ошибке: Traceback (самый последний вызов последнего): файла "C: /Python27/practice1.py", линия 35, в TotalSales = metric ['A'] KeyError: 'A' >>> – megatron77

+0

Да, я уже это исправил. Можете ли вы попробовать еще раз? –

+1

Да, это тоже работает, спасибо также :-) – megatron77

Смежные вопросы