ไทย

เครื่องมือสำหรับนักพัฒนา · JSON ฟอร์แมตเตอร์ & เครื่องมือตรวจสอบความถูกต้อง

เหตุใดไฟล์ JSON บรรทัดไม่ผ่านการตรวจสอบที่บรรทัด 2 คอลัมน์ 1

· มันทำงานอย่างไร

json นักพัฒนาเวิร์กโฟลว์ การตรวจสอบ

เหตุใดไฟล์ JSON Lines ไม่ผ่านการตรวจสอบที่บรรทัด 2 คอลัมน์ 1 แสดงด้วยโทเค็น JSON และขอบเขตการตรวจสอบที่แม่นยำ
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

ไฟล์ .jsonl คือเอกสาร JSON จำนวนมาก ไม่ใช่เอกสารเดียว ดังนั้นเครื่องมือตรวจสอบที่เข้มงวดจะหยุดตรงจุดที่เอกสารที่สองเริ่มต้น โพสต์นี้จะอธิบายแบบแผน JSON บรรทัดและ NDJSON และวิธีการตรวจสอบความถูกต้องของบันทึกทีละรายการ

ใช้ได้ในทุกบรรทัด ไม่ถูกต้องเป็นไฟล์

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

ToolAcre ตรวจสอบหนึ่งข้อความ JSON ไม่ใช่ JSON บรรทัด เมื่อเครื่องสแกนเสร็จสิ้นค่ารูตแรกแล้ว อักขระที่ไม่ใช่ช่องว่างในภายหลังจะถูกรายงานว่าไม่คาดคิดหลังจากสิ้นสุดค่า JSON ไม่มีการตรวจสอบหรือการแปลง NDJSON ต่อบรรทัดเป็นทางเลือกที่ซ่อนอยู่ ความแตกต่างดังกล่าวจะป้องกันไม่ให้ผลลัพธ์สีเขียวบ่งบอกว่าทุกบันทึกในสตรีมแบบเส้นได้รับการตรวจสอบแล้ว

หนึ่งข้อความ หนึ่งค่า — สิ่งที่ RFC 8259 กำหนดว่าเป็นข้อความ JSON และเหตุใดค่าระดับบนสุดสองค่าในแถวจึงเป็นข้อผิดพลาดทางไวยากรณ์

หนึ่งข้อความ หนึ่งค่า — สิ่งที่ RFC 8259 กำหนดว่าเป็นข้อความ JSON และเหตุใดค่าระดับบนสุดสองค่าในแถวจึงเป็นข้อผิดพลาดทางไวยากรณ์ ข้อความ JSON เป็นค่าที่ต่อเนื่องกัน ดังนั้นอ็อบเจ็กต์ อาร์เรย์ สตริง ตัวเลข บูลีน หรือค่าว่างจึงสามารถยืนอยู่ที่รากได้ ช่องว่างอาจล้อมรอบค่านั้น แต่ไม่สามารถแยกหลายรากออกเป็นเอกสารที่ถูกต้องขนาดใหญ่กว่าได้

ตัวอย่างเช่น `{"ok":true} {"ok":false}` มีออบเจ็กต์ที่ถูกต้องสองรายการ แต่ไม่ได้เป็นข้อความ JSON หนึ่งค่า การแยกวิเคราะห์ออบเจ็กต์แรกจะใช้ค่าที่สมบูรณ์ไปแล้ว ดังนั้นการแยกวิเคราะห์ทั้งสตริงต้องปฏิเสธ `{` ตัวที่สอง หากต้องการแทนทั้งสองค่าใน JSON ปกติ ให้วางไว้ในอาร์เรย์และใส่จุลภาคระหว่างสมาชิกอาร์เรย์

JSON เส้นและ NDJSON

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

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

เหตุใดข้อผิดพลาดจึงอยู่ที่บรรทัด 2 คอลัมน์ 1 เสมอ

เหตุใดข้อผิดพลาดจึงอยู่ที่บรรทัด 2 คอลัมน์ 1 เสมอ — parser สิ้นสุดค่าแรก คาดว่าจะสิ้นสุดอินพุต และตรงกับอักขระตัวแรกของระเบียนที่สอง การขึ้นบรรทัดใหม่นั้นเป็นช่องว่างต่อท้ายตามกฎหมาย ดังนั้นจึงไม่ทำให้เกิดความล้มเหลว วงเล็บปีกกาเปิดของเรกคอร์ดถัดไปคือโทเค็นแรกที่ขัดแย้งกับสถานะของเอกสารที่เสร็จสมบูรณ์

ตำแหน่งนั้นเป็นหลักฐานการวินิจฉัยมากกว่าการอ้างว่าวัตถุชิ้นที่สองมีรูปแบบไม่ถูกต้อง หากรายงานชี้ไปที่อักขระตัวแรกที่ไม่ใช่ช่องว่างหลังจากรูทที่ถูกต้อง ให้ตรวจสอบรูปร่างไฟล์ก่อนแก้ไขเครื่องหมายวรรคตอน การลบวงเล็บปีกกาจะทำให้บันทึกเสียหาย การเลือกเครื่องอ่าน line-aware หรือการแปลงบันทึกเป็นอาร์เรย์จะแก้ไขปัญหาความไม่ตรงกันของเฟรมจริง

ตัวอย่างการทำงาน: ตรวจสอบบันทึกบันทึกสามรายการ

ตัวอย่างการทำงาน: การตรวจสอบความถูกต้องของบันทึกบันทึกสามรายการ — ตรวจสอบแต่ละบรรทัดด้วยตัวเอง เทียบกับการล้อมบรรทัดเหล่านั้นในอาร์เรย์ด้วยเครื่องหมายจุลภาค สมมติว่าบรรทัดประกอบด้วย `{"level":"info"}`, `{"level":"warn"}` และ `{"level":"error"}` เครื่องมือตรวจสอบแบบบรรทัดจะแยกวิเคราะห์อินพุตแยกกันสามรายการ และสามารถระบุบันทึกที่แน่นอนได้ หากมีเครื่องหมายคำพูดหรือเครื่องหมายจุลภาคต่อท้ายหายไป

สำหรับการตรวจสอบเอกสารทั้งหมดอย่างเข้มงวด ให้แปลงตัวอย่างเป็น `[{"level":"info"},{"level":"warn"},{"level":"error"}]` วงเล็บเหลี่ยมจะสร้างหนึ่งรูทและเครื่องหมายจุลภาคคั่นระหว่างองค์ประกอบต่างๆ อย่าเพียงแต่แทนที่การขึ้นบรรทัดใหม่ด้วยเครื่องหมายจุลภาค: ที่สร้างสามรากโดยคั่นด้วยเครื่องหมายวรรคตอน เว้นแต่จะมีการเพิ่มอาร์เรย์ที่อยู่รอบๆ เข้าไป และอาจทำให้บรรทัดว่างไม่ถูกต้องซึ่งแบบแผนของแหล่งที่มาอาจห้ามหรือเพิกเฉย

การแปลงระหว่างสองรูปร่าง

การแปลงระหว่างรูปร่างทั้งสอง - เมื่อใดที่อาร์เรย์ที่ตัดคำมีความเหมาะสมและเมื่อใดที่จะเอาชนะจุดของเอาต์พุตที่คั่นด้วยบรรทัด การส่งออกแบบจำกัดสำหรับคำขอ API ตัวแก้ไข หรือเครื่องมือตรวจสอบที่เข้มงวดมักจะกลายเป็นอาร์เรย์ได้ การแปลงต้องแยกวิเคราะห์ทุกบันทึกก่อน เนื่องจากการต่อข้อความไม่สามารถคำนึงถึงอักขระที่หลีกหรือบรรทัดที่ไม่ถูกต้องที่ฝังไว้ได้อย่างปลอดภัย

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

สิ่งนี้ไม่ครอบคลุมถึง

สิ่งนี้ไม่ครอบคลุมถึง - ต่อ JSON ที่ต่อกันโดยไม่มีการขึ้นบรรทัดใหม่และการวางกรอบตัวคั่นบันทึก (RFC 7464) ซึ่งจำเป็นต้องมีตัวแยกวิเคราะห์เฉพาะ ค่าที่วางรวมกันโดยตรงไม่สามารถแยกได้อย่างปลอดภัยด้วยการดำเนินการบรรทัดแบบธรรมดา โดยเฉพาะอย่างยิ่งเมื่อรากอาจเป็นตัวเลขหรือสตริง RFC 7464 ใช้อักขระตัวแยกบันทึก ASCII เพื่อจัดเฟรมลำดับข้อความ JSON แทนที่จะอาศัยเฉพาะบรรทัดใหม่ที่มองเห็นได้

นอกจากนี้ยังไม่ตรวจสอบกฎการสมัครที่ใช้ร่วมกันโดยเรกคอร์ด การแยกวิเคราะห์ทุกบรรทัดไม่สามารถพิสูจน์ได้ว่ามีการเรียงลำดับการประทับเวลา ตัวระบุไม่ซ้ำกัน หรือออบเจ็กต์ทั้งหมดใช้สคีมาเดียวกัน การตรวจสอบเหล่านั้นเกิดขึ้นหลังจากการบันทึกเฟรมและการแยกวิเคราะห์ไวยากรณ์ ในทำนองเดียวกัน การขึ้นบรรทัดใหม่จะฝังอยู่ในลำดับการยกเว้น ` ` ภายในสตริงคือข้อมูล ไม่ใช่ขอบเขตทางกายภาพ และตัวอ่านบรรทัดที่สอดคล้องจะต้องรักษาความแตกต่างนั้นไว้

Takeaway: รู้ว่าคุณกำลังถือรูปร่างไหน

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

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