2010-04-21 117 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()