2011-12-05 18 views
29

Tôi đang phân tích cú pháp dữ liệu json. Tôi không có vấn đề với phân tích cú pháp và tôi đang sử dụng mô-đun simplejson. Nhưng một số yêu cầu api trả về giá trị rỗng. Dưới đây là ví dụ của tôi:Python: Xử lý lỗi giải mã JSON khi không có gì trả về

{ 
"all" : { 
    "count" : 0, 
    "questions" : [  ] 
    } 
} 

Đây là phân đoạn của mã của tôi, nơi tôi phân tích các đối tượng json:

qByUser = byUsrUrlObj.read() 
qUserData = json.loads(qByUser).decode('utf-8') 
questionSubjs = qUserData["all"]["questions"] 

Như tôi đã đề cập đối với một số yêu cầu tôi nhận được lỗi sau:

Traceback (most recent call last): 
    File "YahooQueryData.py", line 164, in <module> 
    qUserData = json.loads(qByUser) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/__init__.py", line 385, in loads 
    return _default_decoder.decode(s) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 402, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 420, in raw_decode 
    raise JSONDecodeError("No JSON object could be decoded", s, idx) 
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0) 

Cách tốt nhất để xử lý lỗi này là gì?

+2

Thực ra, câu hỏi của bạn là gì? – Tadeck

+0

Bạn đã trả lời các câu hỏi;) Có vẻ như tôi đã gửi câu hỏi trước khi thực sự nhập câu hỏi. Cảm ơn câu trả lời. –

+2

Ok, tôi vui vì tôi đã giúp - nó trông giống như một thần giao cách cảm;) Cảm ơn bạn đã bao gồm câu hỏi. Chúc may mắn! – Tadeck

Trả lời

67

Có một quy tắc trong lập trình Python được gọi là "Dễ dàng yêu cầu sự tha thứ hơn cho phép" (viết tắt là EAFP). Nó có nghĩa là bạn nên bắt ngoại lệ thay vì kiểm tra giá trị cho tính hợp lệ.

Vì vậy, hãy thử như sau:

try: 
    qByUser = byUsrUrlObj.read() 
    qUserData = json.loads(qByUser).decode('utf-8') 
    questionSubjs = qUserData["all"]["questions"] 
except ValueError: # includes simplejson.decoder.JSONDecodeError 
    print 'Decoding JSON has failed' 

EDIT: Kể từ simplejson.decoder.JSONDecodeError thực sự thừa hưởng từ ValueError (proof here), tôi đơn giản hóa các tuyên bố bắt bằng cách chỉ sử dụng ValueError.

+3

Bạn nên luôn luôn nắm bắt được ngoại lệ chính xác. Nếu không, bạn có thể thiếu một lỗi trong mã nếu có một ngoại lệ 'ValueError' thực sự, hoặc một số ngoại lệ khác cũng thừa hưởng từ' ValueError'. –

+1

@JulieinAustin: vấn đề là trong trường hợp này bạn thực sự không có nhiều lựa chọn - mô-đun json của stdlib ném ValueError. – Tadeck

+1

Sau đó, tôi sẽ tránh xa bộ giải mã đó. Câu hỏi ban đầu là về mô-đun 'simplejson' và nó tăng rất nhiều' JSONDecodeError' vào đầu vào kém. Xem liên kết trước đó của bạn. –

Các vấn đề liên quan