Cómo decodificar JSON con Python

Obtengo mi JSON de reddit.com, esencialmente algo como esto. He leído un poco, pero realmente no entiendo cómo puedo obtener la información que quiero de este JSON (quiero una lista de los enlaces de la historia). Entiendo que puedo “decodificar” el JSON en un diccionario, pero ¿debo recurrir en todo el JSON para obtener lo que necesito?

Gracias por adelantado.

Si está utilizando Python 2.6 o posterior, use la biblioteca json incorporada. De lo contrario, use simplejson que tiene exactamente la misma interfaz.

Puede hacerlo de forma adaptativa sin tener que comprobar la versión de Python, utilizando un código como el siguiente:

 try: import json except ImportError: import simplejson as json 

Luego, use json.loads() o lo que sea apropiado.

 import urllib2 import json u = urllib2.urlopen('http://www.reddit.com/.json') print json.load(u) u.close() 

Asumo que usted analizaría los datos en un diccionario y luego extraería los bits relevantes de él.

Puedes analizar json en python usando la biblioteca de python apropiada

Hay dos formas de “descodificar” json con Python, después de haberlo analizado en dados y listas con la biblioteca json.

Primero, accediendo a ella por índices, como este:

 url_list = [t['entries'][0]['url'] for t in data['windows'][0]['tabs']] 

O bien, puede iterar sobre su estructura de árbol. La siguiente función de ejemplo no es de propósito general, solo ilustra que debe considerar los tres tipos diferentes de “nodos” de JSON al analizar el árbol. El “valor” de una clave puede ser datos, una lista de nodos secundarios sin claves o un dict que es básicamente un nuevo objeto JSON. No puedes simplemente revisar cada nodo por su nombre, datos e hijos como lo harías con un árbol regular.

 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)