2010-02-25 16 views
19

Otrzymuję mój JSON od reddit.com, zasadniczo something like this. Zrobiłem sporo czytania, ale tak naprawdę nie rozumiem, jak mogę pobrać informacje, które chcę od tego JSON (Chcę listę linków do historii). Rozumiem, że mogę "odkodować" JSON w słowniku, ale czy muszę powtarzać w JSON, aby uzyskać to, czego potrzebuję?Jak rozszyfrować JSON z Pythonem

Z góry dziękuję.

+0

Podczas wyszukiwania w Google Python i JSON, co znalazłeś? Czy próbowałeś "Python Library JSON"? Co widziałeś? –

+34

Podczas wyszukiwania w Google python dekode json znalazłem ten wpis .... – Grummle

Odpowiedz

23

Jeśli używasz Pythona w wersji 2.6 lub nowszej, użyj wbudowanej biblioteki json. W przeciwnym razie użyj simplejson, który ma dokładnie ten sam interfejs.

Można to zrobić bez konieczności adaptacyjnie sprawdzić wersję Pythona siebie, przy użyciu kodu takich jak:

try: 
    import json 
except ImportError: 
    import simplejson as json 

Następnie użyj json.loads() lub cokolwiek co właściwe.

+2

Należy zauważyć, że otwarty adres URL daje obiekt podobny do pliku, więc 'json.load' jest prawdopodobnie odpowiednią funkcją. –

0

Zakładam, że chcesz przeanalizować dane w słowniku, a następnie wyodrębnić z niego odpowiednie bity.

można analizować JSON w Pythonie stosując odpowiednie python library

13
import urllib2 
import json 

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

Istnieją dwa sposoby można „dekodowania” json z Pythonem, po już analizowany go do dicts i list z biblioteki json.

Po pierwsze, dostęp do niej przez indeksy, podobnie jak to:

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

Albo można iteracyjne nad jego strukturze drzewa. Poniższa przykładowa funkcja nie jest ogólnym celem, po prostu ilustruje, że podczas analizowania drzewa należy rozważyć różne rodzaje "węzłów" JSON. "Wartością" klucza może być dane, lista węzłów potomnych bez kluczy lub dyktatura, która jest w zasadzie nowym obiektem JSON. Nie można po prostu sprawdzać każdego węzła pod względem jego nazwy, danych i dzieci podobnych do zwykłych drzew.

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)