ข้อผิดพลาดไวยากรณ์ JSON ที่พบบ่อย: การตรวจสอบโครงสร้าง คอมมาเกิน และตัวเลข 64-bit
สารบัญเนื้อหา
1. มาตรฐาน RFC 8259 และความเข้มงวดของรูปแบบ JSON
JSON (JavaScript Object Notation) เป็นรูปแบบแลกเปลี่ยนข้อมูลมาตรฐานที่ได้รับความนิยมสูงสุดใน REST API และไมโครเซอร์วิส อย่างไรก็ตาม มาตรฐานสากล RFC 8259 มีกฎไวยากรณ์ที่เข้มงวดกว่า JavaScript ทั่วไปอย่างมาก นักพัฒนาจำนวนมากมักคุ้นเคยกับความยืดหยุ่นของภาษา JavaScript จึงมักนำไวยากรณ์ที่ไม่ถูกต้องมาใช้ใน JSON จนทำให้ API เกิดข้อผิดพลาด JSON.parse(): Unexpected token
2. ข้อผิดพลาดไวยากรณ์ยอดนิยม 4 ประการ
| ประเภทข้อผิดพลาด | ตัวอย่างที่ผิด (Invalid) | วิธีแก้ไขที่ถูกต้อง (Valid RFC 8259) |
|---|---|---|
| คอมมาเกินตัวสุดท้าย (Trailing Comma) | {"name": "App", "version": 1,} |
{"name": "App", "version": 1} |
| เครื่องหมายคำพูดเดี่ยว (Single Quotes) | {'title': 'GoToolstack'} |
{"title": "GoToolstack"} |
| คีย์ไม่มีเครื่องหมายคำพูด (Unquoted Keys) | {status: "ok", count: 10} |
{"status": "ok", "count": 10} |
| มีคอมเมนต์ในไฟล์ (Comments) | // การตั้งค่าระบบ |
ลบคอมเมนต์ออกทั้งหมด หรือบันทึกในฟิลด์ "_comment" |
3. กับดักตัวเลขขนาดใหญ่ 64-bit BigInt ใน JavaScript
ปัญหาที่ตรวจพบได้ยากที่สุดอย่างหนึ่งในการจัดการข้อมูล JSON บนเว็บ คือการสูญเสียความแม่นยำของตัวเลขขนาดใหญ่ ในภาษา JavaScript ตัวเลขปกติเป็นไปตามมาตรฐาน IEEE 754 64-bit Float ซึ่งสามารถเก็บค่าจำนวนเต็มที่แม่นยำได้สูงสุดเพียง Number.MAX_SAFE_INTEGER (9,007,199,254,740,991 หรือ $2^{53} - 1$)
หาก API ส่งรหัสประจำตัว เช่น {"id": 9007199254740993} ฟังก์ชัน JSON.parse() มาตรฐานจะปัดเศษตัวเลขนี้เป็น 9007199254740992 ทันที เครื่องมือตรวจสอบ JSON ของ GoToolstack ใช้ตัวแยกวิเคราะห์ Lossless AST Parser พิเศษที่คงรูปแบบโทเค็นตัวเลขดิบไว้ ทำให้ค่าไอดีของฐานข้อมูลไม่ผิดเพี้ยน
4. การวินิจฉัยข้อผิดพลาดแบบระบุบรรทัดและคอลัมน์
เมื่อโครงสร้าง JSON มีความยาวหลายพันบรรทัด การทราบเพียงข้อความแจ้งข้อผิดพลาดทั่วไปไม่เพียงพอ เครื่องมือของเราจะจำลองการสแกนโทเค็นและรายงานตำแหน่งบรรทัด (Line) และคอลัมน์ (Column) ที่เกิดข้อผิดพลาด พร้อมไฮไลต์จุดที่ต้องแก้ไขอย่างแม่นยำ
คำถามที่พบบ่อย (FAQ)
เหตุใดมาตรฐาน JSON จึงไม่อนุญาตให้ใส่คอมเมนต์?
ดักลาส คร็อกฟอร์ด (ผู้สร้างรูปแบบ JSON) ได้ออกแบบให้ JSON ไม่มีคอมเมนต์โดยเจตนา เพื่อป้องกันไม่ให้นักพัฒนานำคอมเมนต์ไปใช้ในการส่งผ่านคำสั่งแยกประเภทการทำงาน ซึ่งอาจทำให้เกิดความไม่เข้ากันระหว่างระบบต่างๆ
เครื่องมือนี้รองรับการมินิฟาย (Minify) ข้อมูล JSON หรือไม่?
รองรับ คุณสามารถเลือกตัดช่องว่างและการขึ้นบรรทัดใหม่ทั้งหมดเพื่อลดขนาดข้อมูลสำหรับส่งผ่านเครือข่าย HTTP หรือจัดรูปแบบให้อ่านง่าย (Prettify) ด้วยการย่อหน้า 2 สเปซ