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

JSON Schema: วิธีอธิบายและตรวจสอบโครงสร้างของ JSON

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

คีย์เวิร์ดหลักของ draft-07

  • type — ประเภทของค่าที่คาดหวัง (object, string, number, array ฯลฯ)
  • required — รายการฟิลด์ของอ็อบเจกต์ที่ต้องมีอยู่
  • properties — คำอธิบายสคีมาสำหรับแต่ละฟิลด์ของอ็อบเจกต์แยกกัน
  • enum — จำกัดค่าให้อยู่ในชุดตัวเลือกที่กำหนด
  • pattern — ตรวจสอบสตริงด้วย regular expression เช่น รูปแบบเลขบัตรประชาชน

ตัวอย่าง: pattern สำหรับเลขบัตรประจำตัวประชาชนไทย

เลขบัตรประจำตัวประชาชนไทยมี 13 หลักเสมอ โดยหลักสุดท้ายเป็นเลขตรวจสอบ (checksum) ที่คำนวณจาก 12 หลักแรก สคีมาสำหรับฟิลด์ในระบบ KYC หรือแบบฟอร์มราชการอาจเขียนได้ว่า: "nationalId": {"type": "string", "pattern": "^\\d{13}$"} รูปแบบนี้ยังไม่ได้ตรวจว่าเลขตรวจสอบถูกต้องตามสูตรคำนวณจริงหรือไม่ — นั่นต้องใช้ตรรกะแยกต่างหาก — แต่ก็จับข้อผิดพลาดที่พบบ่อยได้ทันที เช่น เลขที่มีขีดคั่น (แบบที่พิมพ์บนบัตรจริง 1-2345-67890-12-3) หลุดเข้ามาโดยไม่ได้ตัดออกก่อน หรือจำนวนหลักไม่ครบ 13

ต่างจากการตรวจสอบไวยากรณ์อย่างไร

การตรวจสอบ JSON ทั่วไปจะเช็กแค่ว่าข้อความถูกต้องตามไวยากรณ์ — วงเล็บ เครื่องหมายคำพูด จุลภาคอยู่ในตำแหน่งที่ถูกต้อง JSON Schema ตรวจสอบมากกว่านั้นมาก: อ็อบเจกต์มีฟิลด์บังคับ email หรือไม่ ค่าของ age เป็นตัวเลขไม่ใช่สตริงหรือไม่ status อยู่ในรายการค่าที่อนุญาตหรือไม่

เหตุใดจึงจำเป็น

  • ตรวจสอบว่าการตอบกลับของ API จากบุคคลที่สามตรงกับสัญญาที่บันทึกไว้
  • ตรวจสอบไฟล์การตั้งค่าก่อนการปรับใช้เพื่อจับข้อผิดพลาดได้เร็วขึ้น
  • บันทึกโครงสร้างข้อมูลที่คาดหวังในรูปแบบที่สามารถตรวจสอบได้อัตโนมัติทันที

additionalProperties: เพิ่มฟิลด์ส่วนเกินได้หรือไม่

โดยค่าเริ่มต้น JSON Schema อนุญาตให้ object มีฟิลด์ใดก็ได้เพิ่มเติมนอกเหนือจากที่ระบุใน propertiesrequired และ properties เป็นเพียงการกำหนดขั้นต่ำ ไม่ใช่รายการที่ครบถ้วน หากต้องการห้ามฟิลด์ที่ไม่รู้จัก ต้องเพิ่ม "additionalProperties": false อย่างชัดเจน — หากไม่มีคำสั่งนี้ schema จะยัง "เปิด" อยู่

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