บทความทั้งหมด

JSON Repair: เหตุใด JSON จึงเสียหายและจะแก้ไขอย่างไร

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

สาเหตุทั่วไปของ JSON ที่ไม่ถูกต้อง

  • จุลภาคเกิน ก่อนวงเล็บปิด — {"a": 1,} — ซึ่ง JavaScript ยอมรับได้ แต่ parser JSON ที่เข้มงวดจะไม่ยอมรับ
  • เครื่องหมายคำพูดเดี่ยว แทนที่คู่ — พบบ่อยเมื่อคัดลอกจาก object literal ของ JavaScript
  • คีย์ที่ไม่มีเครื่องหมายคำพูด{name: "สมชาย"} แทนที่จะเป็น {"name": "สมชาย"}
  • คอมเมนต์ — ข้อกำหนด JSON ไม่อนุญาตให้มีคอมเมนต์เลย ต่างจาก JSON5 หรือ JSONC
  • ผลลัพธ์ที่ถูกตัด — หากการตอบกลับ API หรือไฟล์ล็อกถูกตัดกลางคัน เอกสารจะไม่ถูกปิด

เลขไทย (๐-๙) ในค่า JSON — ข้อผิดพลาดที่มองไม่เห็นทันที

แป้นพิมพ์และระบบเก่าบางระบบในไทยยังใช้เลขไทย (๐๑๒๓๔๕๖๗๘๙) แทนเลขอารบิกมาตรฐานที่ใช้ในโค้ด แต่ข้อกำหนด JSON ระบุชัดว่าตัวเลขในค่าต้องเป็นเลขอารบิกแบบ ASCII เท่านั้น ค่าเช่น {"age": ๒๕} ไม่ใช่ตัวเลขที่ถูกต้องเลยในสายตาของ parser ใด ๆ เครื่องมือซ่อมแซมอาจตรวจพบอักขระที่ไม่คาดคิดตรงนั้น แต่ก็ไม่มีทางรู้แน่ชัดว่าควรแปลงเป็นเลขอารบิกตัวใดโดยอัตโนมัติโดยไม่เสี่ยงเดาผิด

การซ่อมแซมอัตโนมัติทำงานอย่างไร

เครื่องมือซ่อมแซม JSON ใช้วิธีการฮิวริสติก: เพิ่มเครื่องหมายคำพูดที่ขาดหาย ลบจุลภาคเกิน ปิดวงเล็บที่ไม่ได้ปิดตามบริบท วิธีนี้ใช้ได้ดีกับข้อผิดพลาดทั่วไปที่พบบ่อย แต่ไม่ใช่เวทมนตร์ — เครื่องมือไม่สามารถเดาได้ว่าค่าใดที่ตั้งใจไว้ หากข้อมูลเสียหายรุนแรงกว่านั้น

ขีดจำกัดของสิ่งที่ทำได้

การซ่อมแซมอัตโนมัติแก้ไขไวยากรณ์ ไม่ใช่ความหมาย หากขาดฟิลด์ทั้งหมด หรือค่าผิดพลาดในเชิงตรรกะ เครื่องมือจะไม่สามารถตรวจพบได้ — ผลลัพธ์ยังคงต้องตรวจสอบด้วยตนเอง โดยเฉพาะเมื่อข้อมูลต้นทางมาจากระบบที่ใช้เลขไทยเป็นค่าเริ่มต้น

เมื่อการซ่อมแซมกำกวม

ความเสียหายบางแบบมีวิธีแก้ไขที่เป็นไปได้พอ ๆ กันหลายแบบ สตริงที่ขาดตอนอย่าง {"a": 1, "b": 2 สามารถปิดด้วยวงเล็บง่าย ๆ — แต่จะทำให้ข้อมูลสูญหายหากตั้งใจจะมีอีกฟิลด์หนึ่ง ฮิวริสติกการซ่อมแซมจะเดา "แบบทำลายน้อยที่สุด" แต่นี่คือการเดา ไม่ใช่การรับประกัน

ลองใช้เครื่องมือ