เครื่องมือสำหรับนักพัฒนา · JSON ฟอร์แมตเตอร์ & เครื่องมือตรวจสอบความถูกต้อง
ถูกต้อง JSON เทียบกับถูกต้องกับสคีมา: ความหมายสองประการของ 'ถูกต้อง'
· พื้นหลัง
json มาตรฐาน การตรวจสอบ
เครื่องมือตรวจสอบความถูกต้องที่บอกว่า JSON ของคุณถูกต้องหมายความว่าจะแยกวิเคราะห์เท่านั้น โพสต์นี้จะอธิบายระดับความถูกต้อง (ไวยากรณ์ โครงสร้าง อรรถศาสตร์) และเหตุใด JSON Schema จึงมีอยู่สำหรับทุกสิ่งที่นอกเหนือจากไวยากรณ์
ถูกต้องและยังคงถูกปฏิเสธ
คำขอสามารถสมบูรณ์แบบ JSON และยังคงไม่สามารถยอมรับได้สำหรับ API `{"username":"nori","plan":"gold"}` มีตัวคั่นที่สมดุล ชื่อที่ยกมา และมูลค่าทางกฎหมาย แต่บริการอาจต้องใช้อีเมล ปฏิเสธชื่อแผน หรือห้ามการสร้างบัญชีในสถานะปัจจุบัน โปรแกรมแยกวิเคราะห์และแอปพลิเคชันตอบคำถามต่างกัน ดังนั้นผลลัพธ์ทั้งสองจึงสามารถถูกต้องได้
ToolAcre ตอบเฉพาะคำถามแรก: ข้อความนี้สามารถแยกวิเคราะห์เป็นแบบเข้มงวด JSON ภายในขีดจำกัดอินพุตได้หรือไม่ มันไม่โหลดสคีมา ตรวจสอบคุณสมบัติที่จำเป็น ตรวจสอบรูปแบบ ติดต่อฐานข้อมูล หรือประเมินกฎเกณฑ์ทางธุรกิจ เมื่อเครื่องมือแจ้งว่าถูกต้อง ให้อ่านว่า "ไวยากรณ์ JSON ที่มีรูปแบบถูกต้อง" ไม่ใช่เป็นการอนุมัติจากระบบที่จะใช้ค่าดังกล่าว
ระดับที่หนึ่ง: รูปแบบไวยากรณ์ที่ดี
การตรวจสอบไวยากรณ์จะตรวจสอบไวยากรณ์ JSON: ค่าระดับบนสุดหนึ่งค่า คอนเทนเนอร์ที่จับคู่อย่างถูกต้อง ชื่ออ็อบเจ็กต์ที่ยกมา เครื่องหมายจุลภาคและโคลอนที่ถูกต้อง สตริงทางกฎหมาย ตัวเลขทางกฎหมาย และตัวอักษรที่แน่นอน โดยจะปฏิเสธ `NaN` และ `Infinity` ความคิดเห็น เครื่องหมายจุลภาคต่อท้าย และสตริงที่มีเครื่องหมายคำพูดเดี่ยว ยอมรับรูปร่างที่ถูกต้องตามไวยากรณ์ รวมถึงตัวเลขเดี่ยวหรือวัตถุที่มีช่องที่ไม่คุ้นเคย
แหล่งที่มาที่มีรูปแบบไม่ถูกต้องมีข้อผิดพลาดด้านข้อความ ดังนั้น ToolAcre จึงสามารถรายงานบรรทัดและคอลัมน์สำหรับอักขระตัวแรกที่เป็นไปไม่ได้ เครื่องหมายจุลภาคที่หายไปอาจทำให้คำพูดถัดไปถูกรายงาน เครื่องหมายจุลภาคต่อท้ายอาจทำให้มีการรายงานตัวคั่นปิด การแก้ไขไวยากรณ์จะสร้างค่าที่สามารถแยกวิเคราะห์ได้ แต่ไม่ได้กำหนดว่าค่านั้นมีรูปร่างหรือความหมายตามที่โปรแกรมอื่นคาดหวัง
ระดับที่สอง: รูปร่าง
การตรวจสอบรูปร่างจะถามว่าค่าที่แยกวิเคราะห์ตรงกับสัญญาที่ประกาศหรือไม่ สคีมาผู้ใช้อาจต้องใช้ `email` จำกัด `age` ให้เป็นจำนวนเต็มอย่างน้อย 18 จำกัด `tier` ไว้ที่ `free` หรือ `pro` และไม่อนุญาตให้ใช้คุณสมบัติที่ไม่รู้จัก `{"email":false,"tier":"gold"}` ถูกต้องตามไวยากรณ์ JSON แต่ไม่ผ่านกฎโครงสร้างเหล่านั้น เนื่องจากประเภทค่าและตัวเลือกที่อนุญาตไม่ถูกต้อง
JSON Schema เป็นวิธีหนึ่งในการแสดงข้อจำกัดดังกล่าว แต่ ToolAcre ไม่ได้ดำเนินการ เครื่องมือตรวจสอบสคีมามักจะรายงานเส้นทางอินสแตนซ์ เช่น `/tier` คำหลัก เช่น `enum` และข้อความอธิบาย แทนที่จะเป็นตัวแยกวิเคราะห์คาเร็ต เก็บเวอร์ชันสคีมาและสัญญา API ไว้ข้างเพย์โหลดเมื่อวิเคราะห์ระดับนี้ การเปลี่ยนเครื่องหมายวรรคตอนจะไม่ซ่อมแซมค่าที่แยกวิเคราะห์อย่างถูกต้องของรูปร่างที่ไม่ถูกต้อง
ระดับที่สาม: ความหมาย
ความหมายขึ้นอยู่กับข้อเท็จจริงและกฎเกณฑ์ที่นอกเหนือไปจากรูปร่างคงที่ของเอกสาร `accountId` สามารถมีรูปแบบสตริงที่ถูกต้องในขณะที่ไม่ได้ตั้งชื่อบัญชี วันที่เริ่มต้นสามารถตรงกับรูปแบบ ISO-style ในขณะที่อยู่หลังวันที่สิ้นสุด ปริมาณอาจเป็นค่าบวกแต่เกินสต็อกในปัจจุบัน ความล้มเหลวเหล่านี้จำเป็นต้องมีบริบทของแอปพลิเคชัน สถานะที่เก็บไว้ หรือความสัมพันธ์ระหว่างฟิลด์
ข้อจำกัดทางความหมายบางอย่างสามารถประมาณได้ในสคีมา แต่หลายข้อจำกัดอยู่ในตรรกะการบริการซึ่งมีข้อมูลที่เชื่อถือได้และสถานะธุรกรรม การตอบกลับข้อผิดพลาดในระดับนี้ควรระบุฟิลด์หรือกฎที่เกี่ยวข้องโดยไม่แสร้งทำเป็นว่าข้อความ JSON มีรูปแบบไม่ถูกต้อง ToolAcre ไม่สามารถทำซ้ำการตัดสินใจเหล่านั้นได้ เนื่องจากไม่ทราบสัญญาหรือส่งข้อมูลไปยังแอปพลิเคชันที่เป็นเจ้าของกฎเกณฑ์ทางธุรกิจ
ตัวอย่างการทำงาน: หนึ่งเพย์โหลดผ่านการตรวจสอบสามครั้ง
เริ่มต้นด้วย `{"sku":"A-19","quantity":3,"warehouse":"north"}` ToolAcre ยอมรับ: ชื่อและค่าทั้งหมดเป็นไปตามไวยากรณ์ JSON สคีมาสามารถกำหนดให้ต้องมีออบเจ็กต์ สตริงที่ไม่ว่างเปล่า SKU ปริมาณจำนวนเต็มบวก และหนึ่งในรหัสคลังสินค้าที่ได้รับการบันทึกไว้ สมมติว่าเพย์โหลดนี้ผ่านข้อจำกัดเหล่านั้นด้วย ไม่มีเช็คใดยืนยันว่า SKU A-19 มีอยู่หรือทางเหนือมีสามยูนิต
บริการสินค้าคงคลังดำเนินการตรวจสอบครั้งที่สามกับบันทึกปัจจุบัน และอาจปฏิเสธคำขอเนื่องจากไม่พร้อมใช้งาน การเปลี่ยนการเยื้องไม่สามารถเปลี่ยนแปลงผลลัพธ์นั้นได้ หาก `quantity` เขียนเป็น `03` ไวยากรณ์จะล้มเหลวก่อน หากเป็น `"3"` การแยกวิเคราะห์จะผ่าน แต่การตรวจสอบประเภทสคีมาจะล้มเหลว ด้วยตัวเลข `3` จะเหลือเพียงกฎสต๊อกสดเท่านั้น ฟิลด์เดียวกันจึงสามารถล้มเหลวในสามเลเยอร์ที่แตกต่างกันด้วยเหตุผลสามประการที่แตกต่างกัน
เช็คแต่ละใบอยู่ที่ไหน
เรียกใช้การตรวจสอบไวยากรณ์โดยเร็วที่สุดในขณะที่แก้ไข เนื่องจากการตรวจสอบในภายหลังไม่สามารถดำเนินการกับข้อความที่ไม่ได้แยกวิเคราะห์ได้อย่างน่าเชื่อถือ บังคับใช้รูปร่างที่ประกาศไว้ในแต่ละขอบเขตแอปพลิเคชันที่ไม่น่าเชื่อถือ แทนที่จะถือว่าไคลเอ็นต์ได้ทำเช่นนั้นแล้ว ประเมินค่าคงที่ของธุรกิจในองค์ประกอบที่เป็นเจ้าของสถานะที่ต้องการ โดยเฉพาะอย่างยิ่งเมื่อคำตอบสามารถเปลี่ยนแปลงระหว่างคำขอได้
การตรวจสอบฝั่งไคลเอ็นต์จะปรับปรุงผลตอบรับแต่ไม่ได้แทนที่การบังคับใช้ฝั่งเซิร์ฟเวอร์ ในทางกลับกัน การตอบสนองของเซิร์ฟเวอร์ที่แจ้งว่า “invalid JSON” ควรสงวนไว้สำหรับการแยกวิเคราะห์ที่ล้มเหลว แทนที่จะใช้กับทุกคำขอที่ถูกปฏิเสธ การแยกที่ชัดเจนทำให้เกิดการวินิจฉัยที่มีประโยชน์: บรรทัดและคอลัมน์สำหรับไวยากรณ์ เส้นทางอินสแตนซ์สำหรับข้อจำกัดทางโครงสร้าง และรหัสหรือข้อความเฉพาะโดเมนสำหรับความขัดแย้งทางความหมาย ToolAcre จัดหาเฉพาะหมวดหมู่แรกเท่านั้น
สิ่งนี้ไม่ครอบคลุมถึง
ตัวจัดรูปแบบนี้ไม่ได้เขียนหรือประเมิน JSON Schema เลือกแบบร่าง แก้ไขการอ้างอิงสคีมา แทรกค่าเริ่มต้น หรือบังคับสตริงเป็นตัวเลข นอกจากนี้ยังไม่ทราบเอกสาร OpenAPI ของ API หรือแบบแผนการตรวจสอบที่กำหนดเอง การจัดหาสคีมาควบคู่ไปกับอินพุตจะไม่เปลี่ยนแปลงผลลัพธ์ของ ToolAcre เนื่องจากไม่มีขั้นตอนการประมวลผลสคีมาในเครื่องมือนี้
การตรวจสอบไวยากรณ์ยังไม่ตรวจพบชื่อวัตถุที่ซ้ำกันที่นี่ `JSON.parse` เก็บรายการสุดท้ายไว้ก่อนที่จะฟอร์แมต และไม่รับประกันความแม่นยำของตัวเลข ไบต์ตามรูปแบบบัญญัติ การแสดงผลหรือการอนุญาตที่ปลอดภัย ข้อกังวลแต่ละข้อจำเป็นต้องมีสัญญาและการนำไปปฏิบัติเป็นของตัวเอง หลีกเลี่ยงการบีบอัดข้อมูลเหล่านั้นให้เป็นป้าย "ถูกต้อง" สีเขียวเพียงป้ายเดียว เนื่องจากการทำเช่นนั้นจะปกปิดหลักฐานที่รวบรวมได้และคำถามใดที่ไม่เคยถูกถาม
Takeaway: 'ถูกต้อง' จำเป็นต้องมีคุณสมบัติ
รับรองทุกการอ้างสิทธิ์การตรวจสอบ “ถูกต้อง JSON” หมายความว่าข้อความเป็นไปตามไวยากรณ์ “ใช้ได้กับสคีมานี้” หมายความว่าค่าที่แยกวิเคราะห์เป็นไปตามสัญญาโครงสร้างที่มีชื่อ “ได้รับการยอมรับจากบริการ” หมายถึงกฎการสมัครปัจจุบันที่อนุญาตให้ดำเนินการได้ การส่งผ่านเลเยอร์หนึ่งเป็นสิ่งจำเป็นสำหรับเลเยอร์ถัดไปในเวิร์กโฟลว์จำนวนมาก แต่ไม่มีหลักฐานว่าเลเยอร์ต่อๆ ไปทั้งหมดผ่านไปแล้ว
ใช้ ToolAcre เพื่อจัดรูปแบบและตรวจสอบไวยากรณ์ที่เข้มงวด ซึ่งรวมถึงการปฏิเสธตัวอักษรที่ไม่ใช่ JSON เช่น `NaN` และ `Infinity` จากนั้นใช้สคีมาและแอปพลิเคชันที่ควบคุมเพย์โหลดจริงๆ เมื่อคำขอยังคงล้มเหลว ให้อ่านข้อผิดพลาดในเลเยอร์ของตัวเอง แทนที่จะฟอร์แมตใหม่ให้ถูกต้อง JSON เครื่องมือนี้ไม่มีการตรวจสอบสคีมา และขอบเขตที่ชัดเจนนั้นมีประโยชน์มากกว่าคำมั่นสัญญาเรื่องความถูกต้องที่กว้างเกินไป