Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python JSONDecodeError คำอธิบายและวิธีแก้ปัญหา

นักพัฒนาหลายคนเก็บข้อมูลจากโปรแกรมในไฟล์ JSON; โปรแกรมอื่น ๆ อ้างอิง API ที่ต้องทำงานกับ JSON อันที่จริง คุณจะไม่มีปัญหาในการค้นหากรณีการใช้งานสำหรับ JSON หรือพจนานุกรมที่เทียบเท่ากับ Python

คุณอาจพบ JSONDecodeError เมื่อคุณทำงานกับข้อมูล JSON ในคู่มือนี้ เราจะพูดถึงสาเหตุของ JSONDecodeError และวิธีแก้ไขข้อผิดพลาดนี้

Python JSONDecodeError

Python JSONDecodeError ระบุว่ามีปัญหาเกี่ยวกับวิธีการจัดรูปแบบข้อมูล JSON ของคุณ ตัวอย่างเช่น ข้อมูล JSON ของคุณอาจไม่มีวงเล็บปีกกา หรือมีคีย์ที่ไม่มีค่า หรือไม่มีส่วนอื่นๆ ของไวยากรณ์

ในการแก้ไข JSONDecodeError ให้สมบูรณ์ คุณต้องไปที่ไฟล์ JSON เพื่อดูว่าปัญหาคืออะไร หากคุณคาดว่าปัญหาหลายอย่างจะเกิดขึ้นในอนาคต คุณอาจต้องการลองใช้...ยกเว้นบล็อกเพื่อจัดการ JSONDecodeError ของคุณ

ตามด้วยคีย์เวิร์ด JSONDecodeError คุณจะเห็นคำอธิบายสั้นๆ ซึ่งอธิบายสาเหตุของข้อผิดพลาด

JSON ที่มีรูปแบบถูกต้องทั้งหมดควรมีลักษณะดังนี้:

{
	"key": "value"
}

“value” อาจเป็นค่า JSON ที่ถูกต้อง เช่น รายการ สตริง หรืออ็อบเจ็กต์ JSON อื่น

ตัวอย่างสถานการณ์

เรากำลังสร้างโปรแกรมที่เก็บรายการของวัตถุ JSON ซึ่งแสดงถึงคอมพิวเตอร์ที่ออกให้กับพนักงานในธุรกิจ แต่ละอ็อบเจ็กต์ JSON ควรมีลักษณะดังนี้:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

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

เราเก็บอ็อบเจ็กต์ JSON เหล่านี้ไว้ในไฟล์ชื่อ equipment.json ไฟล์นี้มีรายการเดียวเท่านั้น:

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

หากต้องการอ่านข้อมูลนี้ในโปรแกรมของเรา เราสามารถใช้โมดูล json:

import json

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

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

ขั้นแรก เรานำเข้าโมดูล json ที่เราใช้ในการอ่านไฟล์ JSON จากนั้น เราใช้ open() คำสั่งเพื่ออ่านเนื้อหาของไฟล์ JSON ของเรา เราพิมพ์ข้อความไปยังคอนโซลเพื่อแจ้งว่าข้อมูลอุปกรณ์ได้รับการดึงออกมาแล้วเมื่อคำสั่ง with ของเราทำงาน

เรียกใช้รหัสของเราและดูว่าเกิดอะไรขึ้น:

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

รหัสของเราส่งคืนข้อผิดพลาดแบบยาว เราจะเห็น Python อธิบายสาเหตุของข้อผิดพลาดหลังจากคำว่า JSONDecodeError

การแก้ปัญหา

JSONDecodeError ของเรากำลังบอกเราว่าเราไม่มีเครื่องหมายทวิภาค (:) ในข้อมูล JSON ของเรา โคลอนนี้ควรปรากฏในบรรทัดที่ 4 ที่คอลัมน์ 16 หากเราดูบรรทัดข้อมูลนี้ในไฟล์ equipment.json เราจะเห็นว่า JSON ของเราไม่ถูกต้อง:

"equip_id" "309",

รหัสของเราไม่มีเครื่องหมายทวิภาค เพื่อแก้ไขข้อผิดพลาดนี้ เราควรเพิ่มโคลอน:

"equip_id": "309",

ตอนนี้เราได้แก้ไขปัญหาเกี่ยวกับวิธีการแสดงข้อมูลของเราแล้ว เราสามารถลองเรียกใช้โปรแกรมของเราอีกครั้ง:

Equipment data has been successfully retrieved.

รหัสของเราดำเนินการได้สำเร็จ

อีกทางหนึ่ง เราอาจใช้การลอง…ยกเว้นตัวจัดการเพื่อจัดการกับปัญหานี้ เพื่อให้โค้ดของเราไม่ส่งคืนข้อผิดพลาดทันทีหากเราประสบปัญหาการจัดรูปแบบอื่น:

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.")

หากมีข้อผิดพลาดในข้อมูล JSON ของเรา โปรแกรมนี้จะกลับมา:

There was a problem accessing the equipment data.

มิฉะนั้น โปรแกรมจะอ่านข้อมูลแล้วแสดงข้อความต่อไปนี้บนคอนโซล:

Equipment data has been successfully retrieved.

บทสรุป

Python JSONDecodeError ระบุว่ามีปัญหากับการจัดรูปแบบวัตถุ JSON ในการแก้ไขข้อผิดพลาดนี้ คุณควรอ่านข้อความแสดงข้อผิดพลาดและใช้เป็นแนวทางในการแก้ไขข้อมูล JSON ของคุณ หรือคุณสามารถใช้การลอง...ยกเว้นการบล็อกเพื่อตรวจจับและจัดการกับข้อผิดพลาด

คุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับการเข้ารหัส Python หรือไม่? อ่านคู่มือ How to Learn Python ของเรา คุณจะพบคำแนะนำจากผู้เชี่ยวชาญเกี่ยวกับวิธีการเรียนรู้ Python และรายการแหล่งข้อมูลการเรียนรู้ที่จะช่วยคุณสร้างความรู้