Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python JSONDecodeError: Giải thích và Giải pháp

Python JSONDecodeError: Giải thích và Giải pháp

Nhiều lập trình viên lưu dữ liệu từ chương trình trong file JSON; chương trình khác tham chiếu API yêu cầu làm việc với JSON. Thực tế, bạn không khó tìm trường hợp dùng JSON, hoặc tương đương Python của nó, dictionary.

Bạn có thể gặp JSONDecodeError khi làm việc với dữ liệu JSON. Trong hướng dẫn này, ta nói về nguyên nhân JSONDecodeError và cách sửa lỗi.

Python JSONDecodeError

Python JSONDecodeError chỉ ra vấn đề với cách dữ liệu JSON được định dạng. Ví dụ: dữ liệu JSON có thể thiếu ngoặc nhọn, hoặc khóa không có giá trị, hoặc thiếu mảnh cú pháp khác.

Để hoàn toàn sửa JSONDecodeError, bạn cần vào file JSON xem vấn đề là gì. Nếu bạn dự đoán nhiều vấn đề trong tương lai, bạn có thể dùng khối try...except xử lý JSONDecodeError.

Sau từ khóa JSONDecodeError, bạn thấy mô tả ngắn mô tả nguyên nhân lỗi.

Tất cả JSON đúng định dạng trông như sau:

{ "key": "value" }

"value" có thể là bất kỳ giá trị JSON hợp lệ: list, chuỗi, hoặc đối tượng JSON khác.

Tình huống ví dụ

Ta xây dựng chương trình lưu list đối tượng JSON biểu diễn máy tính đã cấp cho nhân viên tại doanh nghiệp. Mỗi đối tượng JSON trông như sau:

[
    {
        "name": "Tên nhân viên",
        "equip_id": "000"
    }
]

Ta lưu đối tượng JSON trong file equipment.json. File chỉ chứa một mục:

[
    {
        "name": "Laura Harper",
        "equip_id" "309"
    }
]

Để đọc dữ liệu vào chương trình, ta dùng module json:

import json
with open("equipment.json") as file:
    data = json.load(file)
print("Dữ liệu thiết bị đã truy xuất thành công.")

Đầu tiên, ta import module json đọc file JSON. Sau đó, dùng open() đọc nội dung file JSON. In thông báo ra màn hình rằng dữ liệu thiết bị đã truy xuất khi with chạy xong.

Chạy mã xem gì xảy ra:

Traceback (most recent call last):
File "", line 2, in 
File "/usr/lib/python3.8/json/__init__.py", line 293, in load
return loads(fp.read(),
File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ':' delimiter: line 4 column 16 (char 47

Mã trả về lỗi dài. Ta thấy Python mô tả nguyên nhân lỗi sau từ khóa JSONDecodeError.

Giải pháp

JSONDecodeError báo thiếu dấu hai chấm (:) trong dữ liệu JSON. Dấu hai chấm nên xuất hiện dòng 4 cột 16. Nếu nhìn dòng dữ liệu này trong equipment.json, ta thấy JSON không hợp lệ:

"equip_id" "309",

Mã thiếu dấu hai chấm. Để sửa lỗi, thêm dấu hai chấm:

"equip_id": "309",

Sau khi sửa cách dữ liệu biểu diễn, ta thử chạy chương trình lại:

Dữ liệu thiết bị đã truy xuất thành công.

Mã thực thi thành công.

Thay vào đó, ta có thể dùng try...except xử lý vấn đề để mã không ngay lập tức trả lỗi nếu gặp vấn đề định dạng khác:

import json
try:
    with open("equipment.json") as file:
        data = json.load(file)
    print("Dữ liệu thiết bị đã truy xuất thành công.")
except json.decoder.JSONDecodeError:
    print("Có vấn đề truy cập dữ liệu thiết bị.")

Nếu lỗi trong dữ liệu JSON, chương trình trả về:

Có vấn đề truy cập dữ liệu thiết bị.

Ngược lại, chương trình đọc dữ liệu và hiển thị:

Dữ liệu thiết bị đã truy xuất thành công.

Kết luận

Python JSONDecodeError chỉ ra vấn đề cách đối tượng JSON được định dạng. Để sửa lỗi, đọc thông báo lỗi và dùng nó hướng dẫn sửa dữ liệu JSON. Thay vào đó, dùng try...except bắt và xử lý lỗi.

Bạn quan tâm tìm hiểu thêm lập trình Python? Đọc hướng dẫn "Cách học Python". Bạn tìm thấy lời khuyên chuyên gia học Python và danh sách tài nguyên học tập giúp xây dựng kiến thức.