JSON vs JSON5 vs JSONC
สรุปสำคัญ: superset ที่เข้มงวดเรียงตามลำดับ: JSONC เพิ่ม comment; JSON5 เพิ่มเครื่องหมายคำพูดเดี่ยว, key ที่ไม่มีเครื่องหมายคำพูด, trailing comma และเลขฐานสิบหก ถ้าเลือกผิดจะพังที่ API ไม่ใช่ที่ editor

สรุปสั้น ๆ: ใช้ JSON มาตรฐานทุกครั้งที่ข้อมูลข้ามขอบเขตระบบ และใช้ JSONC เฉพาะ config ในเครื่องที่มนุษย์แก้; ไปใช้ JSON5 เมื่อต้องการเครื่องหมายคำพูดเดี่ยว, trailing comma หรือ key ที่ไม่มีเครื่องหมายคำพูด แต่ต้องยืนยันก่อนว่า loader รองรับ
พูดสั้น ๆ: JSONC คือ JSON บวก comment; JSON5 คือ JSON บวกนิสัยของ JavaScript
ตารางเปรียบเทียบความสามารถ
| ความสามารถ | JSON | JSONC | JSON5 |
|---|---|---|---|
| string ที่ใช้เครื่องหมายคำพูดคู่ | ✅ | ✅ | ✅ |
| string ที่ใช้เครื่องหมายคำพูดเดี่ยว | ❌ | ❌ | ✅ |
| key ที่ไม่มีเครื่องหมายคำพูด | ❌ | ❌ | ✅ |
comment บรรทัด // |
❌ | ✅ | ✅ |
block comment /* */ |
❌ | ✅ | ✅ |
| trailing comma | ❌ | ❌ | ✅ |
เลขฐานสิบหก 0xFF |
❌ | ❌ | ✅ |
Infinity / NaN |
❌ | ❌ | ✅ |
| multi-line string | ❌ | ❌ | ✅ |
| parser มาตรฐานอ่านได้ | ✅ | ❌ | ❌ |
โปรดทราบว่า JSONC แก้เฉพาะเรื่อง comment หลายคนคิดว่า "JSON ที่อนุญาต comment" จะอนุญาต trailing comma ด้วย แต่ tsconfig.json ยังพังที่ trailing comma หนึ่งตัว
แต่ละแบบใช้ทำอะไร
JSON — การแลกเปลี่ยนข้อมูล API, queue, คอลัมน์ JSON ในฐานข้อมูล, log ทุกอย่างที่เครื่องคุยกับเครื่อง
JSONC — config ของ editor VS Code parse ไฟล์เหล่านี้เอง JSON.parse จึงไม่เคยเห็นมัน ไม่มี RFC; เป็นข้อตกลงโดยพฤตินัยที่ Microsoft เป็นผู้นำ
JSON5 — superset แบบผ่อนปรนสำหรับมนุษย์ เป้าหมายคือ "config ที่ดูเหมือน object literal ของ JavaScript" เหมาะที่สุดกับไฟล์ .json5 ที่โหลดโดยเครื่องมือ build; ไวยากรณ์กว้างที่สุดแต่เครื่องมือรองรับแคบที่สุด
การเลือก
| สถานการณ์ | เลือก |
|---|---|
| request หรือ response body | JSON ไม่มีทางเลือกอื่น |
| คอลัมน์ JSON ใน MySQL / PostgreSQL | JSON ฟังก์ชันของมันรับอย่างอื่นไม่ได้ |
| config ของโปรเจกต์ที่ต้องมีคำอธิบาย | JSONC ถ้ารองรับ ไม่เช่นนั้น YAML |
| ต้องการความผ่อนปรนแบบ JS | JSON5 หลังยืนยันว่า loader รองรับ |
| คนที่ไม่ใช่วิศวกรจะมาแก้ | YAML การย่อหน้าเข้าใจง่ายกว่าปีกกา |
กับดักง่าย ๆ หนึ่งอย่าง
การ parse ไฟล์ JSONC เป็น JSON เข้มงวดจะเกิด error ที่ชี้ไปที่ comment:
SyntaxError: Unexpected token / in JSON at position 42
ก่อนลบ comment ให้ตรวจว่าไฟล์นี้ตั้งใจเป็น JSONC หรือไม่ ถ้าลบทิ้งคุณอาจยังเจอ trailing comma อีกสองบรรทัดถัดไป
คำถามที่พบบ่อย
ควรเลือก JSONC หรือ JSON5?
ใช้ JSONC เมื่อ comment เป็นสิ่งเดียวที่ต้องการ: มันเพิ่ม // และ /* */ บน JSON และ settings.json กับ tsconfig.json ของ VS Code ใช้มัน ใช้ JSON5 เมื่อต้องการเครื่องหมายคำพูดเดี่ยว, key ที่ไม่มีเครื่องหมายคำพูด, trailing comma, เลขฐานสิบหก หรือ multi-line string ด้วย ทั้งสองขึ้นกับ loader จึงต้องยืนยันว่าเครื่องมือที่อ่านไฟล์รองรับ
ทำไมไฟล์ JSONC ถึงอ่านเป็น JSON มาตรฐานไม่ได้?
JSONC เป็นข้อตกลงโดยพฤตินัย ไม่ใช่ RFC แยกต่างหาก parser มาตรฐานจึงปฏิเสธ comment JSON.parse กับไฟล์แบบนั้นจะ throw Unexpected token / ชี้ไปที่ comment ไม่ใช่ข้อมูล ควรเขียนเป็น JSONC เฉพาะ config ที่ editor หรือ parser เฉพาะอ่าน
ควรส่งไฟล์ JSON5 ให้ API ไหม?
ไม่ควร API, คอลัมน์ JSON ในฐานข้อมูล และ queue parse JSON เข้มงวด เครื่องหมายคำพูดเดี่ยว, key ที่ไม่มีเครื่องหมายคำพูด และ trailing comma ของ JSON5 จึงถูกปฏิเสธ JSON5 มีไว้สำหรับ config ในเครื่องที่มนุษย์แก้ ให้แปลงเป็น JSON มาตรฐานก่อนข้ามขอบเขตระบบ