2010-04-21 149 views
7

JSON似乎打嗝以下語句:JSON KeyError異常

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

代碼片段:

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

我碰到下面的錯誤輸出時,上面的代碼片斷遇到類似的線上述JSON「字典」:

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

是不是因爲沒有「文字」鍵在該行或因爲「刪除」不在字典中?

回答

1

爲什麼不把這個第一和第二線之間:

print temp 
3

它看起來像這種情況是因爲「文本」是不是在那裏。也許你可以使用類似

'text' in temp 

在試圖使用它之前檢查「文本」是否存在。

編輯:

我已經邁出了評論給出的例子,並增加了IF/ELIF/else塊吧。

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

樣品組塊#1:

{u'favorited ':虛假,u'contributors':無,u'truncated ':虛假,u'text':----剪斷----}

樣品組塊#2:

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

+0

我認爲這是問題,下面jinned了代碼: #!的/ usr /斌/蟒 進口SYS 進口JSON F =開放(sys.argv中[1]) 在F線:0​​\t \t J = json.loads(線) \t \t 嘗試: \t \t '文本' j中 \t \t打印 「TEXT」,J \t情況除外: \t \t打印 「EXCEPTION」,J \t \t繼續 並得到下面的結果(只有兩個樣品塊)... TEXT:{u'favorited ':虛假,u'contributors':無,u'truncated ':虛假,u'text' :---- snip ----} TEXT:{u'delete':{u'status':{u'user_id':55389449,u'id':12600579001L}}} – user322775 2010-04-22 16:13:44

+0

我添加了一個修改後的版本你的代碼給我的答案。這是否適用於您的文件? – ChronoPositron 2010-04-22 20:39:09

+0

這讓我越過了第一個障礙。謝謝! – user322775 2010-04-29 15:52:55

2

從您發佈的代碼段看起來,temp應該只有一個項目,其中包含"delete"。你沒有鑰匙'text',所以我不知道temp['text']應該查找什麼。

4

是否因爲行中沒有「文本」鍵或者「刪除」不在字典中?

這是因爲沒有「文本」鍵。如果您print temp或檢查密鑰'text'是否在生成的Python字典中,您會注意到沒有名爲'text'的密鑰。實際上,temp只有一個關鍵:'delete'。由'delete'引用的字典包含單個密鑰'status',其包含具有兩個密鑰的另一個字典:'user_id''id'

換句話說,你的結構是這樣的:

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

正如你所看到的,沒有「文字」鍵的任何地方。

此外,你可以自己去查:

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

感謝所有的建議。問題的核心在於Twitter json格式在字典中包含字典。解決方案涉及一個雙重索引來獲取我需要檢查的變量。

1

嘗試這樣的:

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

試試這個看具體的問題:

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

產生這樣的輸出:

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

temp的唯一關鍵字典是'刪除'。因此temp['text']生成一個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()