2010-04-21 15 views
7

JSON sembra singhiozzo sulle seguenti affermazioni:json KeyError con json.loads

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

frammento di codice:

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

ottengo il seguente output errore quando il frammento di codice sopra incontra linee simili al "dizionario" JSON sopra:

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

È perché non c'è alcuna chiave "testo" nella linea o perché "cancella" non è nel dizionario?

risposta

1

Perché non mettere questo tra la prima e la seconda linea:

print temp 
3

Sembra che questo accade perché 'testo' non è in là. Forse potresti usare qualcosa come

'text' in temp 

per verificare che "testo" esista prima di provare ad usarlo.

Edit:

ho preso l'esempio dato nel commento e aggiunto un if/elif/else blocco ad esso.

#! /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 

Esempio Chunk # 1:

{u'favorited ': false, u'contributors': None, u'truncated ': Falso, u'text': ---- snip ----}

Esempio Chunk # 2:

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

+0

Ho pensato che era il problema e jinned il codice qui sotto: #!/Usr/bin/python import sys importazione JSON f = open (sys.argv [1]) per la linea in f: \t \t j = json.loads (linea) \t \t provare: \t \t 'testo' in j \t \t stampa "tESTO:" j \t eccezione: \t \t stampa "eCCEZIONE:" j \t \t continuano e ottenere i seguenti risultati (solo due chunks campione) ... TESTO: {u'favorited ': false, u'contributors': Nessuno, u'truncated ': Falso, u'text' : ---- snip ----} TEXT: {u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001L}}} – user322775

+0

Ho aggiunto una versione modificata del tuo codice alla mia risposta. Funziona per il tuo file? – ChronoPositron

+0

Questo mi ha superato il primo ostacolo. Grazie! – user322775

2

Dal frammento che hai postato, sembra che temp debba avere solo un elemento, con la chiave "delete". Non hai una chiave 'text', quindi non sono sicuro di cosa debba cercare temp['text'].

4

È perché non c'è alcun tasto "testo" nella riga o perché "elimina" non è nel dizionario?

È perché non c'è il tasto "testo". Se si print temp o si controlla se il tasto 'text' si trova nel dizionario Python risultante, si noterà che non è presente alcuna chiave denominata 'text'. Infatti, temp ha una sola chiave: 'delete'. Il dizionario a cui fa riferimento 'delete' contiene una chiave singola 'status' che contiene un altro dizionario con due chiavi: 'user_id' e 'id'.

In altre parole, la struttura è questa:

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

Come si può vedere, non c'è una chiave "testo" da nessuna parte.

Inoltre, è possibile controllare voi stessi:

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

Grazie a tutti per i suggerimenti. Il cuore del problema era che il formato JSON di Twitter ha un dizionario all'interno di un dizionario. La soluzione implica un doppio indice per ottenere le variabili che devo controllare.

1

provare in questo modo:

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

Provate a vedere il problema in dettaglio:

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() 

che genera questo output:

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

L'unica chiave nel temp dict è 'cancella'. Pertanto, 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()