2012-09-10 25 views
5

Estoy en mi cabeza, tratando de analizar JSON por primera vez y lidiar con una matriz multidimensional.Analizando muilti dimensional Json array to Python

{ 
    "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" 
     ] 
    } 
    } 
} 

Ésta se divide en 3 partes, los datos estáticos en mi primera dimensión (en secreto, minutos, enlace) ¿Qué necesito para obtener cadenas como separados.

Luego necesito un diccionario por "colección de marcadores" que no tiene nombres corregidos, por lo que necesito el nombre de ellos y los enlaces/nombres de cada marcador.

Luego están los sublinks separados, que siempre es el mismo, donde necesito todos los enlaces en un diccionario por separado.

Estoy leyendo sobre el análisis de JSON, pero la mayoría de las cosas que encuentro es una matriz simple en 1 diccionario. ¿Alguien tiene alguna buena técnica para hacer esto?

+0

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

+0

No creo que esté usando correctamente la palabra "matriz" aquí. Por matriz, creo que "la mayoría de la gente" significa una estructura de datos posiblemente multidimensional compuesta de elementos del mismo tipo. JSON, y sus couterpart de Python "dictados y listas anidados arbitrariamente" generalmente no son matrices, sino "objetos", ese es todo el tema: algo para "contener" una estructura arbitraria de objetos arbitrarios (los objetos deben ser de tipos json-serializables) – heltonbiker

+0

sí, eso también podría ser el motivo por el que mi Google falló miserablemente ... –

Respuesta

11

Después de analizar el JSON, terminará con un dict de Python. Así, supongamos que el anterior es JSON en una cadena capturar_datos llamado:

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

Lo notable de JSON es que su sintaxis es EXACTAMENTE la misma que usaría para crear lo mismo en Python, considerando "cosa" como dictados y listas anidados arbitrariamente . – heltonbiker

+0

@heltonbiker: [Excepto las excepciones] (http://stackoverflow.com/questions/6627635/is-json-syntax-a-strict-subset-of-python-syntax), por supuesto. –

+0

wauv, inmediatamente me hizo entender cómo funciona todo. ¡gracias! ¿Por qué es esto tan difícil de encontrar un ejemplo de en la red ... –

0

Hmm, no json.loads hacer el truco?

Por ejemplo, si los datos están en un archivo,

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'] 

La salida de este código (dada su entrada de la muestra más arriba) es:

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'} 

Lo cual, creo, se obtiene ¿Que necesitas?