2012-09-10 11 views
5

Jestem ponad moją głową, próbując analizować JSON na mój pierwszy raz i radzenia sobie z multi tablicy wymiarowe.Przetwarzanie muilti wymiarową tablicę JSON Pythona

{ 
    "secret": "[Hidden]", 
    "minutes": 20, 
    "link": "http:\/\/www.1.com", 
    "bookmark_collection": { 
    "free_link": { 
     "name": "#free_link#", 
     "bookmarks": [ 
     { 
      "name": "1", 
      "link": "http:\/\/www.1.com" 
     }, 
     { 
      "name": "2", 
      "link": "http:\/\/2.dk" 
     }, 
     { 
      "name": "3", 
      "link": "http:\/\/www.3.in" 
     } 
     ] 
    }, 
    "boarding_pass": { 
     "name": "Boarding Pass", 
     "bookmarks": [ 
     { 
      "name": "1", 
      "link": "http:\/\/www.1.com\/" 
     }, 
     { 
      "name": "2", 
      "link": "http:\/\/www.2.com\/" 
     }, 
     { 
      "name": "3", 
      "link": "http:\/\/www.3.hk" 
     } 
     ] 
    }, 
    "sublinks": { 
     "name": "sublinks", 
     "link": [ 
     "http:\/\/www.1.com", 
     "http:\/\/www.2.com", 
     "http:\/\/www.3.com" 
     ] 
    } 
    } 
} 

ten podzielony jest na 3 części, dane statyczne na moim pierwszym wymiarze (tajne, minuty, Link) Które muszę się jako oddzielne ciągi.

Wtedy muszę słownika za „zbiór zakładek”, które nie mają ustalonej nazwy, więc muszę im nazwy i linki/nazwy każdej zakładki.

Wtedy nie ma oddzielne sublinks który jest zawsze taki sam, gdzie muszę wszystkie linki w osobnym słownika.

Czytam o parsowania JSON, ale większość rzeczy mi się znaleźć to prosta tablica umieścić w 1 słowniku. Czy ktoś ma jakieś dobre techniki, aby to zrobić?

+0

http://docs.python.org/tutorial/datastructures.html –

+0

Nie sądzę używasz słowa „array” właściwie tutaj. Przez tablicę uważam, że "większość ludzi" oznacza potencjalnie wielowymiarową strukturę danych złożoną z elementów tego samego typu. JSON, i ich fragmenty w języku Python "arbitralnie zagnieżdżone dyktemy i listy" zwykle nie są tablicami, ale "obiektami", to jest cały sens: coś, co "trzyma" dowolną strukturę dowolnych obiektów (obiekty muszą być typu serializowanego jsonem). – heltonbiker

+0

tak, to może być powód, dla którego moje googlowanie zakończyło się nieszczęśliwie ... –

Odpowiedz

11

Po analizowania JSON, będzie skończyć z dict Pythona. Więc załóżmy, że powyższe JSON jest w ciąg o nazwie input_data:

import json 
# This converts from JSON to a python dict 
parsed_input = json.loads(input_data) 

# Now, all of your static variables are referenceable as keys: 
secret = parsed_input['secret'] 
minutes = parsed_input['minutes'] 
link = parsed_input['link'] 

# Plus, you can get your bookmark collection as: 
bookmark_collection = parsed_input['bookmark_collection'] 

# Print a list of names of the bookmark collections... 
print bookmark_collection.keys() # Note this contains sublinks, so remove it if needed 

# Get the name of the Boarding Pass bookmark: 
print bookmark_collection['boarding_pass']['name'] 

# Print out a list of all bookmark links as: 
# Boarding Pass 
# * 1: http://www.1.com/ 
# * 2: http://www.2.com/ 
# ... 
for bookmark_definition in bookmark_collection.values(): 
    # Skip sublinks... 
    if bookmark_definition['name'] == 'sublinks': 
     continue 
    print bookmark_definition['name'] 
    for bookmark in bookmark_definition['bookmarks']: 
     print " * %(name)s: %(link)s" % bookmark 

# Get the sublink definition: 
sublinks = parsed_input['bookmark_collection']['sublinks'] 

# .. and print them 
print sublinks['name'] 
for link in sublinks['link']: 
    print ' *', link 
+0

To, co jest niezwykłe w JSON, to to, że jego składnia jest DOKŁADNIE taka sama jak w Pythonie, zważywszy, że "rzecz" jest arbitralnie zagnieżdżonymi dyktami i listami . – heltonbiker

+0

@heltonbiker: [Z wyjątkiem wyjątków] (http://stackoverflow.com/questions/6627635/is-json-syntax-a-strict-subset-of-python-syntax), oczywiście. –

+0

wauv, natychmiast zrozumiałeś, jak to wszystko działa. Dziękuję Ci! Dlaczego tak trudno jest znaleźć przykład w sieci ... –

0

Hmm, nie json.loads rade?

Na przykład, jeśli dane są w pliku,

import json 
text = open('/tmp/mydata.json').read() 

d = json.loads(text) 

# first level fields 
print d['minutes'] # or 'secret' or 'link' 

# the names of each of bookmark_collections's items 
print d['bookmark_collection'].keys() 

# the sublinks section, as a dict 
print d['bookmark_collection']['sublinks'] 

Wyjście z tego kodu (biorąc pod uwagę swój wkład próbki powyżej):

20 
[u'sublinks', u'free_link', u'boarding_pass'] 
{u'link': [u'http://www.1.com', u'http://www.2.com', u'http://www.3.com'], u'name': u'sublinks'} 

Które, jak sądzę, dostaje czego potrzebujesz?