2010-04-21 29 views
7

JSON dường như bị nấc trên những điều khoản sau đây:json KeyError với json.loads

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

đoạn mã:

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

tôi nhận được đầu ra lỗi sau khi đoạn mã trên gặp dòng tương tự vào từ điển JSON 'ở trên':

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

Có phải vì không có khóa "văn bản" trong dòng hoặc bởi vì "xóa" không có trong từ điển?

Trả lời

1

Tại sao không đặt này giữa các dòng đầu tiên và thứ hai:

print temp 
3

Dường như điều này xảy ra bởi vì 'text' không có trong đó. Có thể bạn có thể sử dụng một cái gì đó như

'text' in temp 

để kiểm tra xem 'văn bản' tồn tại trước khi thử sử dụng.

Edit:

tôi đã đưa ra những ví dụ được đưa ra trong những nhận xét và bổ sung thêm một nếu/elif/else khối với nó.

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

mẫu Chunk # 1:

{u'favorited ': False, u'contributors': Không, u'truncated ': False, u'text': ---- snip ----}

mẫu Chunk # 2:

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

+0

Tôi nghĩ đó là vấn đề và đã viết mã bên dưới: #!/Usr/bin/python import sys nhập khẩu json f = open (sys.argv [1]) cho dòng trong f: \t \t j = json.loads (line) \t \t thử: \t \t 'text' trong j \t \t print "tEXT:", j \t trừ: \t \t print "EXCEPTION:", j \t \t tiếp tục và nhận được kết quả như sau (chỉ có hai khối mẫu) ... TEXT: {u'favorited ': False, u'contributors': Không, u'truncated ': False, u'text' : ---- snip ----} TEXT: {u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001L}}} – user322775

+0

Tôi đã thêm phiên bản đã sửa đổi mã của bạn cho câu trả lời của tôi. Điều này có phù hợp với tệp của bạn không? – ChronoPositron

+0

Điều này khiến tôi vượt qua rào cản đầu tiên. Cảm ơn! – user322775

2

Từ đoạn mã bạn đã đăng, có vẻ như temp chỉ nên có một mục, với khóa "delete". Bạn không có khóa 'text', vì vậy tôi không chắc chắn nên xem temp['text'].

4

Có phải vì không có phím "văn bản" trong dòng hoặc vì "xóa" không có trong từ điển?

Đó là vì không có phím "văn bản". Nếu bạn print temp hoặc kiểm tra xem khóa 'text' có trong từ điển Python kết quả không, bạn sẽ nhận thấy rằng không có khóa nào có tên là 'text'. Trên thực tế, temp chỉ có một khóa: 'delete'. Từ điển được tham chiếu bởi 'delete' chứa một khóa đơn 'status' có chứa một từ điển khác có hai khóa: 'user_id''id'.

Nói cách khác, cấu trúc của bạn là thế này:

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

Như bạn thấy, không có "văn bản" chìa khóa bất cứ nơi nào.

Bên cạnh đó, bạn có thể kiểm tra xem nó cho mình:

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

Nhờ tất cả những lời đề nghị. Trung tâm của vấn đề là định dạng json Twitter có một từ điển trong từ điển. Giải pháp liên quan đến một chỉ số kép để có được các biến mà tôi cần phải kiểm tra.

1

thử nó như thế này:

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

Hãy thử này để xem vấn đề một cách chi tiết:

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

nào tạo ra sản lượng này:

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

Chìa khóa duy nhất trong temp dict là 'xóa'. Do đó temp['text'] tạo ra một 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()