Как декодировать JSON с Python
Я получаю свой JSON от reddit.com, по существу что-то вроде этого. Я проделал довольно много чтения, но я Я действительно понимаю, как я могу захватить информацию, которую я хочу от этого JSON (мне нужен список ссылок на сюжет). Я понимаю, что я могу "расшифровать" JSON в словаре, но нужно ли мне повторять все JSON, чтобы получить то, что мне нужно?
Спасибо заранее.
Ответы
Ответ 1
Если вы используете Python 2.6 или более позднюю версию, используйте встроенную библиотеку json
. В противном случае используйте simplejson
, который имеет точно такой же интерфейс.
Вы можете сделать это адаптивно, не проверяя версию Python самостоятельно, используя следующий код:
try:
import json
except ImportError:
import simplejson as json
Затем используйте json.loads()
или как угодно.
Ответ 2
import urllib2
import json
u = urllib2.urlopen('http://www.reddit.com/.json')
print json.load(u)
u.close()
Ответ 3
Я предполагаю, что вы будете разбирать данные в словаре, а затем извлекать из него соответствующие биты.
Вы можете проанализировать json в python, используя соответствующую библиотеку python
Ответ 4
Существует два способа "декодировать" json с Python после того, как вы проанализировали его в dicts и списках с помощью библиотеки json.
Сначала, обратившись к нему по индексам, например:
url_list = [t['entries'][0]['url'] for t in data['windows'][0]['tabs']]
Или вы можете перебирать свою древовидную структуру. Приведенная ниже примерная функция не является общей целью, она просто иллюстрирует, что при анализе дерева необходимо рассматривать JSON три разных типа "узлов" по-разному. Ключевым "значением" могут быть данные, список дочерних узлов без ключей или dict, что в основном новый объект JSON. Вы не можете просто проверить каждый node для его имени, данных и детей, как если бы вы использовали регулярное дерево.
def depthFirstSearch(self, jsonobj, target, parentKey=None):
if isinstance(jsonobj, dict):
for key, value in jsonobj.items():
if isinstance(value, (dict, list)):
self.depthFirstSearch(value, target, key)
else: # "data" node
if key == target and parentKey not in self.parentsToExclude:
self.results.append(value)
self.parents[parentKey] += 1
if isinstance(jsonobj, list):
for value in jsonobj:
#lists don't have keys, pass along key from last dict
self.depthFirstSearch(value, target, parentKey)