2010-04-21 16 views
7

JSON parece estar hipo en las siguientes afirmaciones:JSON con json.loads

{"delete":{"status":{"id":12600579001,"user_id":55389449}}} 

fragmento de código:

temp = json.loads(line) 
text = temp['text'] 

me sale el siguiente salida de error cuando el código anterior se encuentra con líneas similares a 'diccionario' lo anterior JSON:

text = temp['text'] 
KeyError: 'text' 

¿es porque no hay un "texto" clave en la línea o porque "borrar" no está en el diccionario?

Respuesta

1

por qué no poner esto entre la primera y segunda líneas:

print temp 
3

Parece que esto ocurre porque 'texto' no está ahí. Tal vez podría usar algo como

'text' in temp 

para verificar que 'texto' exista antes de intentar usarlo.

Editar:

He tomado el ejemplo dado en el comentario y añadido un if/elif/bloque else a ella.

#! /usr/bin/python 
import sys 
import json 
f = open(sys.argv[1]) 
for line in f: 
    j = json.loads(line) 
    try: 
     if 'text' in j: 
      print 'TEXT: ', j['text'] 
     elif 'delete' in j: 
      print 'DELETE: ', j['delete'] 
     else: 
      print 'Everything: ', j 
    except: 
     print "EXCEPTION: ", j 

Muestra Chunk # 1:

{u'favorited ': Falso, u'contributors': Ninguno, u'truncated ': Falso, u'text': ---- tijeretazo ----}

Sample Chunk # 2:

{u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001L}} }

+0

pensé que era el problema y jinned el código de abajo: #!/Usr/bin/python sys importación importación json f = open (sys.argv [1]) para la línea en f: \t \t j = json.loads (línea) \t \t Proveedores: \t \t 'texto' en j \t \t de impresión "tEXTO:", j \t excepto: \t \t de impresión "excepción", j \t \t continuar y obtener los siguientes resultados (sólo dos trozos de muestra) ... TEXTO: {u'favorited ': false, u'contributors': Ninguno, u'truncated ': Falso, u'text' : ---- snip ----} TEXTO: {u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001L}}} – user322775

+0

He añadido una versión modificada de tu código a mi respuesta. ¿Esto funciona para tu archivo? – ChronoPositron

+0

Esto me ayudó a superar el primer obstáculo. ¡Gracias! – user322775

2

Desde el fragmento que ha publicado, parece que temp solo debe tener un elemento, con la clave "delete". No tiene una clave 'text', por lo que no estoy seguro de qué debería buscar temp['text'].

4

¿Es porque no hay una tecla de "texto" en la línea o porque "borrar" no está en el diccionario?

Es porque no hay una tecla de "texto". Si print temp o comprueba si la clave 'text' está en el diccionario de Python resultante, notará que no hay una clave llamada 'text'. De hecho, temp solo tiene una clave: 'delete'. El diccionario al que hace referencia el 'delete' contiene una sola clave 'status' que contiene otro diccionario con dos claves: 'user_id' y 'id'.

En otras palabras, su estructura es la siguiente:

{ 
    "delete" : { 
     "status" : { 
      "id" : 12600579001, 
      "user_id" : 55389449 
     } 
    } 
} 

Como se puede ver, no hay ninguna clave "texto" en cualquier lugar.

Por otra parte, se puede comprobar usted mismo:

>>> 'text' in temp 
False 
>>> 'delete' in temp 
True 
0

Gracias a todos por las sugerencias. El corazón del problema fue que el formato Twitter json tiene un diccionario dentro de un diccionario. La solución implica un índice doble para obtener las variables que necesito verificar.

1

tratan de esta manera:

temp = json.load(line) 
    for lines in temp 
     text = lines['text'] 
2

Pruebe lo siguiente para ver el problema en detalle:

import json 
line = '{"delete":{"status":{"id":12600579001,"user_id":55389449}}}' 
print 'line:', line 
temp = json.loads(line) 
print 'temp:', json.dumps(temp, indent=4) 
print 'keys in temp:', temp.keys() 

que genera esta salida:

line: {"delete":{"status":{"id":12600579001,"user_id":55389449}}} 
temp: { 
    "delete": { 
     "status": { 
      "user_id": 55389449, 
      "id": 12600579001 
     } 
    } 
} 
keys in temp: [u'delete'] 

La única clave en el temp dict es 'eliminar'. Por lo tanto, temp['text'] genera un KeyError.

0
#!/usr/bin/env python 
import sys 
import json 
from pprint import pprint 


json_file=sys.argv[1] 
json_data=open(json_file) 
j = json.load(json_data) 

def main(): 
    for attribute_key in j['root_attribute']: 
    try: print attribute_key['name'], attribute_key['status'], attribute_key['text'] 
    except KeyError: pass 

if __name__ == "__main__": 
    main()