Python JSONDecodeError: คำอธิบายและวิธีแก้ไข
นักพัฒนาหลายคนจัดเก็บข้อมูลจากโปรแกรมในไฟล์ JSON โปรแกรมอื่นๆ อ้างอิง APIs ที่ต้องทำงานกับ JSON แน่นอน คุณจะหา use case สำหรับ JSON หรือเพื่อนร่วมทีมใน Python คือ dictionaries ได้ง่าย
คุณอาจเจอ JSONDecodeError เมื่อทำงานกับข้อมูล JSON ในคู่มือนี้ เราจะพูดถึงสาเหตุของ JSONDecodeError และวิธีแก้ไขข้อผิดพลาดนี้
Python JSONDecodeError
Python JSONDecodeError บ่งชี้ว่ามีปัญหากับรูปแบบการจัดรูปแบบข้อมูล JSON ของคุณ เช่น ข้อมูล JSON อาจขาดวงเล็บปีกกา หรือมีคีย์ที่ไม่มีค่า หรือขาด syntax ชิ้นอื่นๆ
เพื่อแก้ไข JSONDecodeError ให้สมบูรณ์ คุณต้องเข้าไปในไฟล์ JSON ดูว่าปัญหาคืออะไร หากคุณคาดการณ์ว่าจะมีปัญหาหลายอย่างในอนาคต คุณอาจต้องการใช้บล็อก try...except จัดการ JSONDecodeError
ตามหลังคีย์เวิร์ด JSONDecodeError คุณควรเห็นคำอธิบายสั้นๆ อธิบายสาเหตุของข้อผิดพลาด
JSON ที่จัดรูปแบบถูกต้องทั้งหมดควรเป็นแบบนี้:
{ "key": "value" }
"value" สามารถเป็นค่า JSON ที่ถูกต้องใดๆ เช่น ลิสต์ สตริง หรือออบเจ็กต์ JSON อื่น
สถานการณ์ตัวอย่าง
เรากำลังสร้างโปรแกรมจัดเก็บลิสต์ออบเจ็กต์ JSON แทนคอมพิวเตอร์ที่จ่ายให้พนักงานในธุรกิจ แต่ละออบเจ็กต์ JSON ควรเป็นแบบนี้:
[
{
"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 statement รัน
มารันโค้ดและดูเกิดอะไร:
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)
โค้ดคืนข้อผิดพลาดยาว เราเห็น Python อธิบายสาเหตุข้อผิดพลาดหลังคำว่า JSONDecodeError
วิธีแก้ไข (The Solution)
JSONDecodeError ของเราบอกว่าเราขาดทวิภาค (:) ในข้อมูล JSON ทวิภาคนี้ควรปรากฏบรรทัดที่สี่ คอลัมน์ 16 หากเราดูบรรทัดข้อมูลนี้ในไฟล์ equipment.json เราจะเห็น JSON ไม่ถูกต้อง:
"equip_id" "309",
โค้ดของเราขาดทวิภาค เพื่อแก้ไขข้อผิดพลาดนี้ เราควรเพิ่มทวิภาค:
"equip_id": "309",
ตอนนี้เราแก้ปัญหาการแทนข้อมูลแล้ว เราสามารถลองรันโปรแกรมอีกครั้ง:
Equipment data has been successfully retrieved.
โค้ดรันสำเร็จ
ทางเลือกอื่น เราสามารถใช้ try...except handler จัดการปัญหานี้ เพื่อโค้ดไม่คืนข้อผิดพลาดทันทีหากเผชิญปัญหาการจัดรูปแบบอีก:
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 หรือใช้บล็อก try...except จับและจัดการข้อผิดพลาด
สนใจเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโค้ด Python? อ่านคู่มือ How to Learn Python คุณจะพบคำแนะนำจากผู้เชี่ยวชาญวิธีเรียน Python และรายการแหล่งทรัพยากรช่วยสร้างความรู้