ข้อมูล JSON (.json)
RFC มาตรฐานJavaScript Object Notation (JSON) คือรูปแบบข้อความน้ำหนักเบาที่มนุษย์อ่านได้สำหรับการแลกเปลี่ยนข้อมูล โดยไม่ขึ้นกับภาษาโดยสิ้นเชิงและถูกใช้งานอย่างแพร่หลายทั่วโลกสำหรับเว็บ API
แปลง JSON เป็น HTML
ตัวแปลงจาก JSON เป็น HTML ฟรีในเบราว์เซอร์ แปลงไฟล์ได้ทันทีบนอุปกรณ์ของคุณ
บีบอัด JSON ออนไลน์
เป็นส่วนตัว - ไฟล์จะไม่ออกจากอุปกรณ์ของคุณ
ตรวจสอบไฟล์และข้อมูลเมตา
ระบบปฏิบัติการและเครื่องมือวิเคราะห์ไฟล์จะระบุไฟล์ JSON โดยการตรวจสอบลำดับไบต์ไบนารีส่วนต้น:
ลายเซ็นส่วนหัวระดับไบต์
ระบบปฏิบัติการและเครื่องมือวิเคราะห์ไฟล์จะระบุไฟล์ JSON โดยการตรวจสอบลำดับไบต์ไบนารีส่วนต้น:
ลายเซ็น HEX (OFFSET 0):
7B or 5Bการแสดงผลรูปแบบ ASCII: { or [
มาตรฐาน: RFC 8259 / ECMA-404 / ISO/IEC 21778
ข้อมูลจำเพาะทางเทคนิค
| สถาปัตยกรรมคอนเทนเนอร์ | รูปแบบการแลกเปลี่ยนข้อมูลที่มีน้ำหนักเบา เป็นรูปแบบข้อความ และไม่ขึ้นกับภาษา |
| การบีบอัด | การบีบอัดข้อความด้วย Gzip / Brotli / Zstandard (โดยทั่วไปมีอัตราส่วนการบีบอัด 80% - 90%) |
| การจัดลำดับไบต์ | ยูนิโค้ดที่เข้ารหัสแบบ UTF-8 (แนะนำว่าไม่ควรมี Byte Order Mark หรือ BOM) |
| พื้นที่สี | ไม่เกี่ยวข้อง |
| ช่องสัญญาณและโครงสร้าง | ประเภทข้อมูลพื้นฐานหกประเภท: object, array, string, number, boolean, null |
| ขนาดสูงสุด | ไม่จำกัด; ถูกจำกัดด้วยหน่วยความจำของตัววิเคราะห์ข้อมูลและความยาวสตริงสูงสุดเท่านั้น |
| ความโปร่งใส | ไม่เกี่ยวข้อง |
| การสตรีมและแบบโปรเกรสซีฟ | NDJSON (Newline Delimited JSON) / JSON Lines ช่วยให้สามารถประมวลผลสตรีมแบบต่อเนื่องได้ |
ตารางเปรียบเทียบทางเทคนิค: JSON กับคู่แข่ง
| คุณลักษณะทางเทคนิค | JSON (ปัจจุบัน) | YAML | XML | Protocol Buffers |
|---|---|---|---|---|
| ความซับซ้อนของไวยากรณ์ | ต่ำ (6 ประเภท ไวยากรณ์เคร่งครัด) | สูง (ใช้การเยื้องบรรทัด และมีข้อกำหนดซับซ้อน) | สูง (แท็กปิดที่ยาว และเนมสเปซ) | รูปแบบไบนารีสำหรับส่งข้อมูลที่กำหนดด้วยสคีมา |
| ประสิทธิภาพการแยกวิเคราะห์ | รวดเร็วอย่างยิ่งในทุกภาษาสมัยใหม่ | ช้า (การแยกวิเคราะห์การเยื้องบรรทัดที่ซับซ้อน) | ปานกลางถึงช้า (การสร้าง DOM ที่ใช้ทรัพยากรมาก) | เร็วมาก (การดีซีเรียลไลซ์ข้อมูลไบนารีโดยไม่คัดลอกข้อมูล) |
| การรองรับคอมเมนต์ | ไม่รองรับ (ตัดออกโดยเจตนาเพื่อป้องกันไม่ให้ข้อมูลเมตาเพิ่มพูนขึ้น) | รองรับ (คอมเมนต์ที่ขึ้นต้นด้วย #) | รองรับ (คอมเมนต์รูปแบบ <!-- -->) | รองรับในไฟล์ .proto |
| ขนาดข้อมูลเพย์โหลดเครือข่าย | ข้อความขนาดกะทัดรัด (อัตราส่วน gzip สูงมาก) | ข้อความขนาดกะทัดรัด | ข้อความขนาดยาว (การทำซ้ำของแท็กหนักหน่วง) | ข้อมูลไบนารีที่มีขนาดกะทัดรัดมาก |
รูปแบบความเสียหายทั่วไปและคู่มือการกู้คืน Hex
SyntaxError: พบอักขระ , ที่ไม่คาดคิดใน JSON ณ ตำแหน่ง X
สาเหตุหลัก: จุลภาคปิดท้ายหลังรายการสุดท้ายในอาร์เรย์หรือออบเจกต์ ซึ่งไม่อนุญาตใน JSON ตามมาตรฐาน RFC 8259
การกู้คืน: ลบจุลภาคปิดท้ายในออบเจกต์และอาร์เรย์ก่อนส่งข้อมูลไปยัง JSON.parse()
SyntaxError: พบอักขระ ' ที่ไม่คาดคิดใน JSON
สาเหตุหลัก: สตริงหรือคีย์ถูกครอบด้วยเครื่องหมายคำพูดเดี่ยว ('') แทนที่จะเป็นเครื่องหมายคำพูดคู่ ("")
การกู้คืน: เปลี่ยนสตริงและคีย์ทั้งหมดที่ใช้เครื่องหมายคำพูดเดี่ยวให้ใช้เครื่องหมายคำพูดคู่ตามมาตรฐาน
การวิเคราะห์ความปลอดภัยและเวกเตอร์การโจมตีตัวแยกวิเคราะห์
JSON เป็นรูปแบบข้อความล้วนและปลอดภัยจากการเรียกใช้โค้ดโดยตรง แต่การแยกวิเคราะห์ JSON ที่ไม่น่าเชื่อถืออาจทำให้เกิด Prototype Pollution, การโจมตีแบบ ReDoS หรือภาวะหน่วยความจำเต็ม
เวกเตอร์การโจมตีที่ทราบ
- Prototype Pollution: คีย์ชื่อ '__proto__' หรือ 'constructor' ที่แก้ไข Object.prototype ในแอปพลิเคชัน JavaScript
- การโจมตีแบบปฏิเสธการให้บริการด้วยสแต็กโอเวอร์โฟลว์จากโครงสร้าง JSON ที่ซ้อนกันลึกมาก (เช่น วงเล็บเปิด 10,000 ตัว)
- การสูญเสียความแม่นยำของตัวเลข: ตัวเลขใน JavaScript ที่มีค่ามากกว่า 2^53 - 1 (9,007,199,254,740,991) จะสูญเสียความแม่นยำไปโดยไม่มีการแจ้งเตือน
แนวทางปฏิบัติที่ดีที่สุดในการป้องกัน: ห้ามประมวลผล JSON ด้วย eval() ให้ใช้ JSON.parse() และตรวจสอบจัดการคุณสมบัติ '__proto__' อย่างปลอดภัยในฟังก์ชันรวมออบเจกต์แบบเรียกซ้ำ
ประวัติความเป็นมาและเหตุการณ์สำคัญ
ข้อได้เปรียบและจุดเด่นสำคัญ
- โครงสร้างข้อความที่มนุษย์อ่านได้ อธิบายตัวเองได้ และกระชับ
- รองรับการแยกวิเคราะห์ในตัวในเอ็นจิน JavaScript (JSON.parse) และภาษาการเขียนโปรแกรมหลักทุกภาษา
- ข้อกำหนดที่เข้มงวดช่วยป้องกันการรันโค้ดโดยพลการ
ข้อจำกัดทางเทคนิคและข้อควรพิจารณา
- ไม่รองรับความคิดเห็น คอมมาส่วนเกินที่ท้ายรายการ หรือการอ้างอิงออบเจกต์แบบวนลูป
- ไม่มีประเภทไบนารีในตัว (ข้อมูลไบนารีต้องถูกเข้ารหัสด้วย base64 ซึ่งทำให้ขนาดเพิ่มขึ้น 33%)
- การซีเรียลไลซ์ไม่มีประสิทธิภาพเมื่อเทียบกับรูปแบบไบนารี เช่น Protocol Buffers หรือ MessagePack
เกร็ดความรู้ทางเทคนิคที่น่าสนใจ
- Douglas Crockford เพิ่มข้อกำหนดในสัญญาอนุญาตซอฟต์แวร์ของเครื่องมือ JSON ใน JSMin รุ่นแรกว่า 'ซอฟต์แวร์นี้ต้องใช้เพื่อความดี ไม่ใช่ความชั่ว'
- JSON เป็นส่วนย่อยที่เคร่งครัดของไวยากรณ์ JavaScript แต่ก่อน ES2019 อักขระ U+2028 และ U+2029 ที่ไม่ได้ escape สามารถใช้ใน JSON ได้ แต่ใช้ในสตริง JavaScript ไม่ได้
- Douglas Crockford พบว่าเว็บเบราว์เซอร์ยุคแรกสามารถใช้ eval() ซึ่งเป็นฟังก์ชันในตัวของ JavaScript ประมวลผล JSON ให้เป็นออบเจกต์ได้โดยตรง ก่อนที่ API เฉพาะทางอย่าง JSON.parse() จะได้รับการกำหนดเป็นมาตรฐานใน ECMAScript 5
คำถามทางเทคนิคที่พบบ่อย
ทำไม JSON ถึงไม่อนุญาตให้ใส่ความคิดเห็น
ไวยากรณ์ JSON ไม่อนุญาตให้มีความคิดเห็น การใช้งานแต่ละแบบอาจจัดการส่วนขยายและข้อมูลเฉพาะแอปต่างกัน ดังนั้นรูปแบบเพียงอย่างเดียวจึงไม่รับประกันการทำงานร่วมกัน
จะจัดเก็บจำนวนเต็ม 64 บิตใน JSON โดยไม่สูญเสียความแม่นยำได้อย่างไร
ชนิด Number ในตัวของ JavaScript เป็นเลขทศนิยมแบบความแม่นยำสองเท่าตามมาตรฐาน IEEE 754 จึงรองรับจำนวนเต็มได้อย่างแม่นยำถึง 2^53 - 1 เท่านั้น ดังนั้นจำนวนเต็ม 64 บิต (เช่น ID ฐานข้อมูลหรือการประทับเวลา) จึงต้องซีเรียลไลซ์เป็นสตริง (เช่น '1234567890123456789') ใน JSON
ความแตกต่างระหว่าง JSON และ NDJSON / JSON Lines คืออะไร
JSON มาตรฐานห่อหุ้มเพย์โหลดทั้งหมดไว้ในออบเจกต์รากหรืออาร์เรย์เดียว ทำให้ตัวแยกวิเคราะห์ต้องโหลดข้อความทั้งหมดก่อนประมวลผล ส่วน NDJSON (Newline Delimited JSON) แยกแต่ละระเบียน JSON ที่ถูกต้องด้วยอักขระขึ้นบรรทัดใหม่ (\n) จึงสตรีมชุดข้อมูลขนาดหลายกิกะไบต์ทีละบรรทัดได้โดยใช้หน่วยความจำอย่างมีประสิทธิภาพ
คู่การแปลงไฟล์ JSON ที่เกี่ยวข้อง
การแปลงข้อมูล JSON เป็นซอร์สโค้ด HTML จะเปลี่ยนคู่คีย์-ค่าที่มีโครงสร้างดิบให้เป็นเอกสารเว็บที่มนุษย์อ่านได้ พร้อมสำหรับการเรนเดอร์บนเบราว์เซอร์
การแปลงซอร์สโค้ด HTML เป็นข้อมูล JSON จะเปลี่ยนเอกสารเว็บที่มนุษย์อ่านได้ให้เป็นคู่คีย์-ค่าที่มีโครงสร้าง สำหรับการประมวลผลด้วยโปรแกรมและการรับส่งข้อมูลผ่าน API
การแปลงไฟล์ดัมพ์ SQL แบบข้อความเป็นไฟล์ส่งออกข้อมูล JSON จะเปลี่ยนตารางฐานข้อมูลเชิงสัมพันธ์ที่มีโครงสร้างตายตัวให้เป็นออบเจ็กต์ซ้อนกันที่ยืดหยุ่น สำหรับเว็บแอปสมัยใหม่
การแปลงไฟล์ข้อความ JSON ที่ไม่มีโครงสร้างให้เป็นฐานข้อมูลเชิงสัมพันธ์ SQLite ที่มีโครงสร้าง ช่วยให้สามารถจัดทำดัชนีและคิวรีบันทึกข้อมูลขนาดใหญ่ได้อย่างรวดเร็ว
การแปลงไฟล์ Adobe Swatch Exchange เป็นโครงสร้าง Color JSON จะเปลี่ยนชุดสีสำหรับงานออกแบบที่จัดเก็บแบบไบนารีให้เป็นออบเจกต์ข้อความที่อ่านได้สำหรับแอปเว็บสมัยใหม่
การแปลงข้อมูลข้อความ JSON สำหรับข้อมูลสีเป็นชุดสีไบนารี Adobe ASE ช่วยเชื่อมโยงโทเค็นการออกแบบบนเว็บกับแอปพลิเคชันจัดหน้าเอกสารระดับมืออาชีพบนเดสก์ท็อป
การแปลงไฟล์ข้อความชุดสี GIMP เป็นโครงสร้าง JSON สำหรับข้อมูลสี ช่วยให้เว็บแอปอ่านค่าสีได้โดยตรงโดยไม่ต้องใช้สคริปต์แยกวิเคราะห์ที่ซับซ้อน
การแปลงไฟล์ JSON สำหรับข้อมูลสีที่มีโครงสร้างเป็นตัวแปร CSS จะเปลี่ยนออบเจ็กต์ข้อมูลดิบให้เป็นคุณสมบัติการจัดรูปแบบที่เว็บไซต์นำไปใช้ได้โดยตรง