Computer >> Máy Tính >  >> Lập trình >> Python

Giải thích và giải pháp lỗi Python JSONDecodeError

Nhiều nhà phát triển lưu trữ dữ liệu từ một chương trình trong một tệp JSON; các chương trình khác API tham chiếu yêu cầu hoạt động với JSON. Thật vậy, bạn sẽ không gặp khó khăn khi tìm một trường hợp sử dụng cho JSON, hoặc các từ điển tương đương Python của nó.

Bạn có thể gặp lỗi JSONDecodeError khi bạn đang làm việc với dữ liệu JSON. Trong hướng dẫn này, chúng ta sẽ nói về nguyên nhân gây ra lỗi JSONDecodeError và cách khắc phục lỗi này.

Python JSONDecodeError

Lỗi JSONDecodeError của Python cho biết có vấn đề với cách định dạng dữ liệu JSON của bạn. Ví dụ:dữ liệu JSON của bạn có thể thiếu dấu ngoặc nhọn hoặc có khóa không có giá trị hoặc thiếu một số đoạn cú pháp khác.

Để khắc phục hoàn toàn lỗi JSONDecodeError, bạn cần truy cập tệp JSON để xem vấn đề là gì. Nếu bạn đoán trước được nhiều vấn đề sắp xảy ra trong tương lai, bạn có thể muốn sử dụng khối try… Ngoại trừ để xử lý JSONDecodeError của mình.

Tiếp theo là từ khóa JSONDecodeError, bạn sẽ thấy một mô tả ngắn mô tả nguyên nhân của lỗi.

Tất cả JSON được định dạng đúng sẽ trông giống như sau:

{
	"key": "value"
}

“Value” có thể là bất kỳ giá trị JSON hợp lệ nào, chẳng hạn như danh sách, chuỗi hoặc đối tượng JSON khác.

Một tình huống mẫu

Chúng tôi đang xây dựng một chương trình lưu trữ danh sách các đối tượng JSON đại diện cho những máy tính nào đã được cấp cho nhân viên tại một doanh nghiệp. Mỗi đối tượng JSON sẽ giống như sau:

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình đã dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

[
	{
		"name": "Employee Name",
		"equip_id": "000"
	}
]

Chúng tôi lưu trữ các đối tượng JSON này trong một tệp có tên là device.json. Tệp chỉ chứa một mục nhập:

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

Để đọc dữ liệu này vào chương trình của chúng tôi, chúng tôi có thể sử dụng mô-đun json:

import json

with open("equipment.json") as file:
	data = json.load(file)

print("Equipment data has been successfully retrieved.")

Đầu tiên, chúng tôi nhập mô-đun json mà chúng tôi sử dụng để đọc tệp JSON. Sau đó, chúng tôi sử dụng open() để đọc nội dung của tệp JSON của chúng tôi. Chúng tôi in ra một thông báo đến bảng điều khiển cho chúng tôi biết dữ liệu thiết bị đã được truy xuất sau khi câu lệnh with của chúng tôi đã chạy.

Hãy chạy mã của chúng tôi và xem điều gì sẽ xảy ra:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  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ã của chúng tôi trả về một lỗi dài. Chúng ta có thể thấy Python mô tả nguyên nhân gây ra lỗi của chúng ta sau thuật ngữ JSONDecodeError.

Giải pháp

JSONDecodeError của chúng tôi đang cho chúng tôi biết rằng chúng tôi đang thiếu dấu hai chấm (:) trong dữ liệu JSON của chúng tôi. Dấu hai chấm này sẽ xuất hiện trên dòng 4 ở cột 16. Nếu chúng ta nhìn vào dòng dữ liệu này trong tệp device.json, chúng ta có thể thấy JSON của chúng ta không hợp lệ:

"equip_id" "309",

Mã của chúng tôi thiếu dấu hai chấm. Để khắc phục lỗi này, chúng ta nên thêm dấu hai chấm:

"equip_id": "309",

Bây giờ chúng tôi đã khắc phục sự cố với cách thức biểu diễn dữ liệu của chúng tôi, chúng tôi có thể thử chạy lại chương trình của mình:

Equipment data has been successfully retrieved.

Mã của chúng tôi thực thi thành công.

Ngoài ra, chúng tôi có thể sử dụng trình xử lý thử… ngoại trừ để xử lý vấn đề này để mã của chúng tôi sẽ không trả lại lỗi ngay lập tức nếu chúng tôi gặp phải vấn đề định dạng khác:

import json

try:
	with open("equipment.json") as file:
		data = json.load(file)

	print("Equipment data has been successfully retrieved.")
except json.decoder.JSONDecodeError:
	print("There was a problem accessing the equipment data.")

Nếu có lỗi trong dữ liệu JSON của chúng tôi, chương trình này sẽ trả về:

There was a problem accessing the equipment data.

Nếu không, chương trình sẽ đọc dữ liệu và sau đó hiển thị văn bản sau trên bảng điều khiển:

Equipment data has been successfully retrieved.

Kết luận

Python JSONDecodeError cho biết có vấn đề với cách định dạng đối tượng JSON. Để khắc phục lỗi này, bạn nên đọc thông báo lỗi và sử dụng nó để hướng dẫn bạn sửa dữ liệu JSON của mình. Ngoài ra, bạn có thể sử dụng khối try… Ngoại trừ để bắt và xử lý lỗi.

Bạn có muốn tìm hiểu thêm về mã hóa Python? Đọc hướng dẫn Cách học Python của chúng tôi. Bạn sẽ tìm thấy lời khuyên của chuyên gia về cách học Python và danh sách các tài nguyên học tập để giúp bạn xây dựng kiến ​​thức của mình.