ข้อมูล JSON (.json)

RFC มาตรฐาน

JavaScript Object Notation (JSON) คือรูปแบบข้อความน้ำหนักเบาที่มนุษย์อ่านได้สำหรับการแลกเปลี่ยนข้อมูล โดยไม่ขึ้นกับภาษาโดยสิ้นเชิงและถูกใช้งานอย่างแพร่หลายทั่วโลกสำหรับเว็บ API

แปลง JSON เป็น HTML

ตัวแปลงจาก JSON เป็น HTML ฟรีในเบราว์เซอร์ แปลงไฟล์ได้ทันทีบนอุปกรณ์ของคุณ

บีบอัด JSON ออนไลน์

เป็นส่วนตัว - ไฟล์จะไม่ออกจากอุปกรณ์ของคุณ

ตรวจสอบไฟล์และข้อมูลเมตา

ระบบปฏิบัติการและเครื่องมือวิเคราะห์ไฟล์จะระบุไฟล์ JSON โดยการตรวจสอบลำดับไบต์ไบนารีส่วนต้น:

เลือกหรือวางไฟล์ที่นี่

เป็นส่วนตัว - ไฟล์จะไม่ออกจากอุปกรณ์ของคุณ

หรือวาง Ctrl+V
รับประกันความเป็นส่วนตัวโดยไม่มีการส่งข้อมูลผ่านเครือข่าย: อัปโหลด 0 ไบต์ไปยังเซิร์ฟเวอร์ภายนอก การประมวลผลทั้งหมดเกิดขึ้นภายในแซนด์บ็อกซ์ของเบราว์เซอร์ของคุณ

ลายเซ็นส่วนหัวระดับไบต์

ระบบปฏิบัติการและเครื่องมือวิเคราะห์ไฟล์จะระบุไฟล์ 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 (ปัจจุบัน)YAMLXMLProtocol 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__' อย่างปลอดภัยในฟังก์ชันรวมออบเจกต์แบบเรียกซ้ำ

ประวัติความเป็นมาและเหตุการณ์สำคัญ

2017RFC 8259 กำหนดให้ UTF-8 เป็นการเข้ารหัสอักขระมาตรฐานเพียงหนึ่งเดียวสำหรับ JSON
2013ECMA-404 กำหนดไวยากรณ์ JSON ซึ่งใช้ในภาษาโปรแกรมและแพลตฟอร์มจำนวนมาก
2001Douglas Crockford กำหนดรูปแบบ JSON เพื่อรองรับการสื่อสารข้อมูลแบบไร้สถานะระหว่างเบราว์เซอร์กับเซิร์ฟเวอร์

ข้อได้เปรียบและจุดเด่นสำคัญ

  • โครงสร้างข้อความที่มนุษย์อ่านได้ อธิบายตัวเองได้ และกระชับ
  • รองรับการแยกวิเคราะห์ในตัวในเอ็นจิน 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

การแปลงข้อมูล JSON เป็นซอร์สโค้ด HTML จะเปลี่ยนคู่คีย์-ค่าที่มีโครงสร้างดิบให้เป็นเอกสารเว็บที่มนุษย์อ่านได้ พร้อมสำหรับการเรนเดอร์บนเบราว์เซอร์

HTML เป็น JSON

การแปลงซอร์สโค้ด HTML เป็นข้อมูล JSON จะเปลี่ยนเอกสารเว็บที่มนุษย์อ่านได้ให้เป็นคู่คีย์-ค่าที่มีโครงสร้าง สำหรับการประมวลผลด้วยโปรแกรมและการรับส่งข้อมูลผ่าน API

SQL เป็น JSON

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

JSON เป็น SQLITE

การแปลงไฟล์ข้อความ JSON ที่ไม่มีโครงสร้างให้เป็นฐานข้อมูลเชิงสัมพันธ์ SQLite ที่มีโครงสร้าง ช่วยให้สามารถจัดทำดัชนีและคิวรีบันทึกข้อมูลขนาดใหญ่ได้อย่างรวดเร็ว

ASE เป็น JSON

การแปลงไฟล์ Adobe Swatch Exchange เป็นโครงสร้าง Color JSON จะเปลี่ยนชุดสีสำหรับงานออกแบบที่จัดเก็บแบบไบนารีให้เป็นออบเจกต์ข้อความที่อ่านได้สำหรับแอปเว็บสมัยใหม่

JSON เป็น ASE

การแปลงข้อมูลข้อความ JSON สำหรับข้อมูลสีเป็นชุดสีไบนารี Adobe ASE ช่วยเชื่อมโยงโทเค็นการออกแบบบนเว็บกับแอปพลิเคชันจัดหน้าเอกสารระดับมืออาชีพบนเดสก์ท็อป

GPL เป็น JSON

การแปลงไฟล์ข้อความชุดสี GIMP เป็นโครงสร้าง JSON สำหรับข้อมูลสี ช่วยให้เว็บแอปอ่านค่าสีได้โดยตรงโดยไม่ต้องใช้สคริปต์แยกวิเคราะห์ที่ซับซ้อน

JSON เป็น CSS

การแปลงไฟล์ JSON สำหรับข้อมูลสีที่มีโครงสร้างเป็นตัวแปร CSS จะเปลี่ยนออบเจ็กต์ข้อมูลดิบให้เป็นคุณสมบัติการจัดรูปแบบที่เว็บไซต์นำไปใช้ได้โดยตรง