带有json.loads的json KeyError

时间:2010-04-21 23:24:10

标签: python json

JSON似乎在以下声明中打嗝:

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

代码段:

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

当上面的代码片段遇到类似于上面的JSON'字典'的行时,我得到以下错误输出:

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

是因为该行中没有“text”键,还是因为“delete”不在字典中?

10 个答案:

答案 0 :(得分:7)

  

是因为该行中没有“text”键,还是因为“delete”不在字典中?

这是因为没有“文本”键。如果您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

答案 1 :(得分:5)

看起来这是因为'text'不在那里。也许你可以使用像

这样的东西
'text' in temp

在尝试使用之前检查'text'是否存在。

修改

我采用了评论中给出的示例,并添加了一个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':False,u'contributors':None,u'truncated':False,u'text':---- snip ----}

样本块#2:

  

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

答案 2 :(得分:2)

在您发布的代码段中,看起来temp应该只有一个项目,密钥为"delete"。您没有密钥'text',因此我不确定temp['text']应该查找哪些内容。

答案 3 :(得分: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 dict中唯一的关键是'删除'。因此temp['text']会生成KeyError。

答案 4 :(得分:1)

为什么不把它放在第一行和第二行之间:

print temp

答案 5 :(得分:1)

尝试这样:

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

答案 6 :(得分:0)

感谢大家的建议。问题的核心是Twitter json格式在字典中有一个字典。该解决方案涉及一个双索引来获取我需要检查的变量。

答案 7 :(得分: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()

答案 8 :(得分:0)

如果缺少密钥时出现 valid 情况,请使用dict.get(key[, default])temp.get('text')而非temp['text'] 不会引发异常,但是如果找不到密钥,则返回Null

EAFP(比许可更容易寻求宽恕)比LBYL(越过跳跃先看看)更具Python感。

答案 9 :(得分:0)

仅是经过验证的答案的更新版本。

如果该错误发生的频率(意味着变量text在json文件中不存在)低于50%,那么解决方法就是找到所需的答案。

但是,如果异常确实很特殊,则应使用

try:
   #your code here
except KeyError:
   continue