เครื่องมือสำหรับนักพัฒนา · JSON ฟอร์แมตเตอร์ & เครื่องมือตรวจสอบความถูกต้อง
ไวยากรณ์ JSON ทั้งหมดในหน้าเดียว: ประเภทค่า 6 ประเภท และคอนเทนเนอร์ 2 รายการ
· พื้นหลัง
json มาตรฐาน การตรวจสอบ
ไวยากรณ์ทั้งหมดของ JSON พอดีในหน้าเดียว และการรู้ด้วยใจจริงทำให้ข้อผิดพลาดของเครื่องมือตรวจสอบทุกรายการชัดเจน โพสต์นี้จะอธิบายเกี่ยวกับค่า 6 ประเภท คอนเทนเนอร์ 2 แบบ และกฎจำนวนหนึ่งที่ดึงดูดผู้คน
ทุกข้อผิดพลาดที่คุณเคยเห็นมาจากหน้าเดียว
ข้อผิดพลาดทางไวยากรณ์ทุกครั้งถือเป็นความคาดหวังที่เสียหายในไวยากรณ์ที่มีขนาดกะทัดรัด หลังจากที่อ็อบเจ็กต์เปิด parser คาดว่าชื่อสมาชิกที่ยกมาหรือเครื่องหมายปีกกาปิด หลังชื่อ คาดว่าจะมีเครื่องหมายทวิภาค หลังค่า คาดว่าจะมีเครื่องหมายจุลภาคหรือส่วนท้ายของคอนเทนเนอร์ การอ่านข้อผิดพลาดเนื่องจากการเปลี่ยนผ่านที่ล้มเหลวมีประโยชน์มากกว่าการถือว่าตัวละครที่รายงานเป็นเรื่องลึกลับ
ToolAcre ยอมรับค่า JSON มาตรฐานและช่องว่าง จากนั้นใช้ขีดจำกัดอินพุตจริง 2 รายการ ข้อความที่ยาวเกิน 8,000,000 อักขระถูกปฏิเสธก่อนที่จะแยกวิเคราะห์ และเครื่องสแกนที่ซ้อนเกินคอนเทนเนอร์ 512 จะถูกปฏิเสธ แทนที่จะข้ามไปอย่างไม่มีกำหนด สิ่งเหล่านั้นคือขอบเขตของผลิตภัณฑ์ ไม่ใช่ประเภท JSON ใหม่ ภายในนั้น การวินิจฉัยจะระบุจุดแรกที่สตรีมโทเค็นไม่สามารถตอบสนองไวยากรณ์ได้อีกต่อไป
ค่าทั้งหกค่า ได้แก่ object, array, string, number, true/false และ null และข้อเท็จจริงที่ว่าไม่มีอย่างอื่นอีกเลย
ค่า JSON คืออ็อบเจ็กต์ อาร์เรย์ สตริง ตัวเลข บูลีน หรือค่าว่าง ออบเจ็กต์และอาร์เรย์สามารถมีรายการใดรายการหนึ่งจากทั้งหมด 6 รายการ รวมถึงคอนเทนเนอร์เพิ่มเติมด้วย การสะกดตามตัวอักษรคือ `true`, `false` และ `null` ทุกประการ การใช้อักษรตัวพิมพ์ใหญ่ไม่ยืดหยุ่น โทเค็น เช่น `True`, `None`, `undefined`, `NaN` และ `Infinity` อยู่นอกขอบเขตที่เข้มงวด JSON แม้ว่าภาษาอื่นจะจดจำบางส่วนได้ก็ตาม
รายการสั้นๆ นี้ทำให้การจำแนกประเภทเป็นเทคนิคการดีบักที่มีประโยชน์ ใน `{"reading": NaN}` โคลอนแนะนำค่าอย่างถูกต้อง แต่ `N` ไม่สามารถขึ้นต้นค่าใดๆ ที่อนุญาตได้ แทนที่หลังจากตัดสินใจว่าข้อมูลควรหมายถึงอะไรเท่านั้น อาจเป็น `null` หรือสถานะที่ยกมา เครื่องมือไวยากรณ์สามารถปฏิเสธโทเค็นได้ ไม่สามารถเลือกผู้สมัครทดแทนหรือตัดสินใจว่าฟิลด์นั้นอยู่ในนั้นหรือไม่
วัตถุและอาร์เรย์ — สมาชิกที่คั่นด้วยเครื่องหมายจุลภาค เครื่องหมายทวิภาค และเหตุใด RFC 8259 ออกจากการเรียงลำดับและชื่อที่ซ้ำกันในการใช้งาน
ออบเจ็กต์มีสมาชิก name/value ที่คั่นด้วยเครื่องหมายจุลภาค ทุกชื่อเป็นสตริงที่มีเครื่องหมายคำพูดคู่ตามด้วยโคลอนและค่า อาร์เรย์มีค่าที่คั่นด้วยเครื่องหมายจุลภาคโดยไม่มีชื่อหรือเครื่องหมายทวิภาค คอนเทนเนอร์ `{}` และ `[]` ที่ว่างเปล่านั้นถูกต้อง แต่เครื่องหมายจุลภาคไม่สามารถนำ ลาก หรือปรากฏสองครั้ง การจับคู่ตัวคั่นแต่ละตัวกับคอนเทนเนอร์จะทำให้เกิดความล้มเหลว "โทเค็นที่ไม่คาดคิด" ที่ชัดเจนจำนวนมากอย่างรวดเร็ว
ชื่อออบเจ็กต์คาดว่าจะไม่ซ้ำกัน แต่การสะกดซ้ำจะไม่ถูกปฏิเสธโดยเครื่องมือตรวจสอบนี้ `{"port": 80, "port": 443}` แยกวิเคราะห์ และ `JSON.parse` คงค่าที่ตามมาไว้ จากนั้นการจัดรูปแบบจะปล่อยเฉพาะสมาชิกที่ยังมีชีวิตอยู่ ดังนั้นข้อความก่อนหน้าจึงไม่สามารถกู้คืนจากผลลัพธ์ได้ ตำแหน่งของอาร์เรย์มีพฤติกรรมแตกต่างออกไป: ทุกองค์ประกอบยังคงอยู่และลำดับขององค์ประกอบจะเป็นส่วนหนึ่งของค่า
สตริงและตัวเลขอย่างแม่นยำ
สตริงใช้เครื่องหมายคำพูดคู่ แบ็กสแลชอาจแนะนำเครื่องหมายคำพูด, แบ็กสแลช, สแลช, `b`, `f`, `n`, `r`, `t` หรือการหลีกหนี Unicode สี่หลัก ห้ามใช้อักขระควบคุมดิบ เครื่องหมายคำพูดเดี่ยวเป็นโทเค็นที่ไม่ถูกต้องทั่วไปที่อยู่นอกสตริง กฎเหล่านี้อธิบายว่าทำไมการคัดลอก JavaScript ตัวอักษรและข้อความหลายบรรทัดที่วางจึงสามารถอ่านได้ในขณะที่ไม่ผ่านการตรวจสอบความถูกต้อง JSON อย่างเข้มงวด
ตัวเลขอาจมีเครื่องหมายลบ ส่วนจำนวนเต็ม เศษส่วนเผื่อเลือก และเลขชี้กำลังเสริมก็ได้ ไม่สามารถขึ้นต้นด้วย `+` ใช้รูปแบบเลขฐานสิบหก นำศูนย์นำหน้าตัวเลขอื่น หรือสะกดค่าที่ไม่สิ้นสุด `-0.25e+2` ถูกต้อง; `01`, `.5`, `2.` และ `Infinity` ไม่ใช่ การแยกวิเคราะห์จะตรวจสอบไวยากรณ์ ไม่ใช่ว่า JavaScript สามารถรักษาตัวเลขทุกหลักไว้ได้หรือไม่
ช่องว่างและระดับบนสุด
สตริงภายนอก JSON ช่องว่างจำกัดอยู่ที่ช่องว่าง แท็บแนวนอน การป้อนบรรทัด และการขึ้นบรรทัดใหม่ พื้นที่ไม่แยกที่คัดลอกมาจากหน้าเว็บไม่สามารถใช้แทนพื้นที่ปกติได้ การจัดรูปแบบอาจเลือกระหว่างช่องว่างที่อนุญาตรอบๆ โทเค็นได้อย่างอิสระ แต่จะต้องรักษาช่องว่างที่อยู่ภายในสตริงที่ยกมาเนื่องจากอักขระเหล่านั้นเป็นข้อมูล
เอกสารฉบับสมบูรณ์อาจเป็นค่า JSON ใดๆ ก็ได้ ไม่ใช่แค่ออบเจ็กต์หรืออาร์เรย์เท่านั้น `42`, `false` และ `"ready"` เป็นข้อความระดับบนสุดที่ถูกต้อง สิ่งที่ต้องห้ามคือค่าที่สองหลังจากค่าแรก: `42 43` คือเอกสารสองฉบับ ไม่ใช่หนึ่งเอกสาร ความแตกต่างนี้อธิบายว่าทำไม JSON ที่คั่นด้วยบรรทัดใหม่จึงต้องมีการจัดการแบบบันทึกต่อบันทึก แทนที่จะแยกวิเคราะห์ไฟล์ทั้งหมดแบบธรรมดา
ตัวอย่างการทำงาน: แยกวิเคราะห์เอกสารขนาดเล็กด้วยมือ
พิจารณา `{"order": [17, null, {"paid": true}], "note": "ship soon"}` ออบเจ็กต์รากเริ่มด้วยสมาชิกชื่อ `order` ซึ่งมีค่าเป็นอาร์เรย์ที่ประกอบด้วยตัวเลข null และออบเจ็กต์อีกหนึ่งรายการ จากนั้นเครื่องหมายจุลภาคจะนำเข้าสมาชิก `note` ซึ่งมีค่าเป็นสตริงที่มีอักขระขึ้นบรรทัดใหม่แบบ escape เครื่องหมายทวิภาค จุลภาค และตัวคั่นปิดแต่ละตัวมีหน้าที่ทางไวยากรณ์เพียงอย่างเดียว
ตอนนี้ให้ลบคำพูดก่อนหน้า `paid` ออก หลังจากวงเล็บปีกกาที่ซ้อนกัน parser คาดว่าจะมีเครื่องหมายปีกกาปิดหรือชื่อที่ยกมา ดังนั้นจึงล้มเหลวที่ `p` หรือเพิ่มลูกน้ำหลัง `true`; parser ยอมรับเครื่องหมายจุลภาคแล้วล้มเหลวที่ `}` เนื่องจากสมาชิกอื่นต้องติดตาม การคาดการณ์ตำแหน่งเหล่านั้นด้วยมือจะเปลี่ยนการตรวจสอบให้เป็นการยืนยัน และไม่สนับสนุนการแก้ไขเครื่องหมายวรรคตอนแบบสุ่ม
สิ่งนี้ไม่ครอบคลุมถึง
ไวยากรณ์ไม่มีวันที่ เงินทศนิยม ไบนารี UUID หรือประเภทระยะเวลา แอปพลิเคชันมักจะแสดงแนวคิดเหล่านั้นด้วยสตริงหรือตัวเลข และกำหนดหลักเกณฑ์แยกกัน การประทับเวลาอาจเป็นสตริง JSON ที่ถูกต้องสมบูรณ์แต่ก็มีวันที่ที่เป็นไปไม่ได้ ในทำนองเดียวกัน ออบเจ็กต์ที่ถูกต้องตามหลักไวยากรณ์สามารถละเว้นคุณสมบัติที่จำเป็นหรือใช้หน่วยที่ไม่ถูกต้องโดยไม่ละเมิดกฎการแยกวิเคราะห์แม้แต่ข้อเดียว
ToolAcre ไม่ดำเนินการตรวจสอบสคีมา การตรวจสอบความถูกต้องของโดเมน หรือการกำหนดรูปแบบมาตรฐาน และจะไม่ตีความคุณลักษณะ JSON5 หรือ JSONC ซ้ำ เช่น ความคิดเห็นและเครื่องหมายจุลภาคต่อท้าย งานของมันแคบกว่า: ยอมรับข้อความ JSON ที่เข้มงวดหนึ่งข้อความภายในขีดจำกัดผลิตภัณฑ์ จัดรูปแบบค่าที่แยกวิเคราะห์ และระบุความล้มเหลวทางไวยากรณ์ เก็บคำถามในภายหลังเกี่ยวกับรูปร่างและความหมายไว้ในชั้นการตรวจสอบความถูกต้องของแอปพลิเคชันที่ใช้งาน
ประเด็นสำคัญ: จดจำไวยากรณ์ ไว้วางใจตำแหน่ง
รายการตรวจสอบที่คงทนนั้นสั้น: หกหมวดหมู่ของค่า ชื่ออ็อบเจ็กต์ที่ยกมา เครื่องหมายจุลภาคระหว่างรายการเท่านั้น เครื่องหมายทวิภาคระหว่างชื่อและค่าเท่านั้น การหลีกเลี่ยงสตริงที่เข้มงวด การสะกดตัวเลขที่เข้มงวด อักขระช่องว่างสี่ตัว และค่าระดับบนสุดหนึ่งค่าเท่านั้น เมื่อเอกสารล้มเหลว ให้ระบุสิ่งที่ไวยากรณ์อนุญาตทันทีก่อนตำแหน่งที่รายงาน และเปรียบเทียบความคาดหวังนั้นกับตัวละครที่มีอยู่จริง
เชื่อว่าตำแหน่งเป็นจุดแรกที่เป็นไปไม่ได้ ไม่ใช่ตัวละครที่ต้องลบเสมอไป วงเล็บปีกกาปิดอาจถูกเน้นเนื่องจากเครื่องหมายจุลภาคนำหน้าสัญญากับสมาชิกอีกคน จดหมายที่ไร้เดียงสาอาจถูกเน้นเนื่องจากเครื่องหมายคำพูดเปิดหายไป ซ่อมแซมสาเหตุ ดำเนินการตรวจสอบความถูกต้องอีกครั้ง และทำซ้ำ สำหรับการป้อนข้อมูลที่มีขนาดใหญ่เกินไปหรือลึกมาก ให้ระบุขอบเขตผลิตภัณฑ์ 8 ล้านอักขระหรือ 512 เชิงลึกก่อนที่การวินิจฉัยไวยากรณ์จะสามารถช่วยได้