2014-07-12 7 views
0

Новое для JSON и Python. Я успешно вызов и может получить выход, используя что-то вроде этогоJSON Выход в словарь Python - Сложность понимания

def lendbook(currency='xtl'): #GET /lendbook/:currency 

    r = requests.get(URL + "/lendbook/" + currency, verify=False) 
    rep = r.json() 

    return rep 

print lendbook() 

начинает печать данных из тонкой, но реальную неразбериху для нового новичка. Образец ниже из консоли Python

{u'bids': [{u'timestamp': u'1405112154.0', u'rate': u'0.365', u'frr': u'No', u'amount': u'20.0', u'period': 30}], u'asks': [{u'timestamp': u'1405143214.0', u'rate': u'1.9345', u'frr': u'No', u'amount': u'0.72115369', u'period': 2}, {u'timestamp': u'1401975696.0', u'rate': u'2.0', u'frr': u'Yes', u'amount': u'0.53', u'period': 30}, {u'timestamp': u'1405011490.0', u'rate': u'2.0', u'frr': u'Yes', u'amount': u'3.44796922', u'period': 30}, {u'timestamp': u'1405137594.0', u'rate': u'2.0', u'frr': u'Yes', u'amount': u'0.12279759', u'period': 2}, {u'timestamp': u'1405139396.0', u'rate': u'2.0', u'frr': u'Yes', u'amount': u'1.84883351', u'period': 2}, {u'timestamp': u'1405140302.0', u'rate': u'2.0', u'frr': u'Yes', 

Очевидно, что я хочу, чтобы отформатировать дату и на самом деле действительно только после того, как скорость и период. Какую структуру циклов для словарей следует использовать, когда я использую цикл FOR, я только возвращаю слова «ставки» и «спрашивает». Очевидно, что в словаре я не понимаю?

Действительно ценит помощь, как я получаю мою голову вокруг JSON и Python словарей

+1

Итерации по словарю итерации по его ключам. Вместо этого используйте 'для ключа, значение в d.iteritems()'. – Blender

+0

Я думаю, что вам не хватает в том, что словарь содержит список словарей; это все вложенное. Вы можете понять это лучше, если вы хорошо напечатаете JSON или dict. –

+0

Я нахожу, что 'pprint' является удивительным инструментом отладки ' от pprint import ppriny; pprint (lendbook()) '.Вы также можете не выполнять цикл, если знаете путь к данным, которые вы хотите получить в ответ: 'print (lendbook() ['bids'] [0] ['timestamp'])' или только перебирать по 'list' с 'for' и не перебирать сами словарные статьи. – ThorSummoner

ответ

0

Похоже, что объект JSON, который вы получаете, содержит объекты (списки) (т. Е. «Ставки» и «спрашивает»). Поэтому я думаю, вы в замешательстве, почему вы не обращаетесь к значениям. Я предлагаю вам сначала завладеть интересующим вас предметом (скажем, «ставки»);

bidsList = rep['bids'] 

Как вы можете видеть, что «ставки» - это список объектов (указывает [] >>). Теперь вы можете итератировать.

#[{'timestamp': '1405112154.0', 'rate': '0.365', 'frr': 'No', 'amount': '20.0', 'period': 30}] 
>>> bidsList = rep['bids'] 
>>> for obj in bidsList: 
>>> print obj 
... 
{'timestamp': '1405112154.0', 'rate': '0.365', 'frr': 'No', 'amount': '20.0', 'period': 30} 

Вы можете получить значение, как,

>>> for obj in bidsList: 
>>> print obj['timestamp'] 
.... 
1405112154.0 
>>> 

Я предлагаю вам создать классы по имени товар, Спрашивает и любой другой тип объекта вы знаете, возвращаются в том, что JSON объект вашего. Затем вы можете получить доступ к объекту (rep ['theObject']) и создать экземпляр ставок (передать ему json-объект и получить экземпляр). Это избавит вас от всего этого, поскольку логика получения объекта будет проходить в классе сам. Я бы сказал, лучший дизайн.

Также (давайте просто скажем, что вы хотите придерживаться этого подхода), если вы не хотите жестко кодировать вещи, скажите, что вы хотите написать код, который не зависит от того, что возвращается в JSON. В этом случае вы можете использовать Iterator над возвращаемым Dict («rep») в вашем случае, и для каждого объекта, который вы получаете на итерации, вы проверяете тип, если это сам dict, тогда вы делаете то же самое для него (итератор по клавишам), или если это список, вы повторяете, как я уже упоминал, в противном случае обращайтесь к значениям через ключи.

Надеюсь, это поможет!

2

Когда цикл по словарю, вы только петля через его keys используя базовую for петли.

Изменить это как for key, value in dict.iteritems():.

>>> obj = {'bids': [1000, 2999], 'asks': [4, 5]} 
>>> for key, value in obj.iteritems(): 
...  print key, value 
... 
bids [1000, 2999] 
asks [4, 5] 
>>> 
+0

Когда я использую это для цикла для г в lendbook(): печати я возвращает ставки Спрашивает Использования ключа и значение вы предлагаете возвращает ValueError: слишком много значений для распаковки – user3787389

+0

@ user3787389, да? – ZenOfPython

0

Распечатайте тип данных с помощью типа(). Таким образом, вы можете знать тип данных в json &, обрабатывая его шаг за шагом.

+0

Это, безусловно, словарь. Но я подозреваю, что у него может быть массив как один из его значений, но он не может сделать головы или хвосты из данных JSON – user3787389

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