เครื่องมือสำหรับนักพัฒนา · ตัวแปลงไวยากรณ์
JSON ถูกต้อง YAML หรือไม่ สิ่งที่ YAML 1.2 ให้สัญญา และจุดแตกหัก
· พื้นหลัง
json yaml ข้อมูลรูปแบบ
YAML 1.2 ได้รับการออกแบบเพื่อให้เอกสาร JSON ทุกฉบับเป็นเอกสาร YAML ด้วย ด้วยเหตุนี้ การแปลง JSON ถึง YAML จึงเป็นเรื่องเล็กน้อย โพสต์นี้จะอธิบายสิ่งที่ข้อกำหนดรับประกันจริง ๆ และกรณีขอบที่สัญญาล้มเหลว
วาง JSON ลงในไฟล์ YAML และดำเนินการต่อไป — เหตุใดจึงใช้งานได้ และครั้งหนึ่งไม่ได้ผล
อ็อบเจ็กต์ JSON ธรรมดาสามารถวางลงในฝั่งแหล่งที่มา YAML และอ่านภายใต้ ToolAcre ของ YAML 1.2 JSON สคีมา วงเล็บปีกกา วงเล็บเหลี่ยม คีย์เครื่องหมายคำพูด สตริง ตัวเลข บูลีน และค่าว่าง จะกลายเป็นค่า JavaScript ธรรมดาที่เหมือนกัน นั่นอธิบายว่าทำไมขอบเขตจึงมักรู้สึกไม่สำคัญ
การรับประกันควรคงอยู่เฉพาะตัวแยกวิเคราะห์ ToolAcre จำกัดแท็ก ชื่อแทนตัวพิมพ์ใหญ่ และการซ้อน และใช้ขีดจำกัดอินพุต ข้อความสามารถใช้ได้ภายใต้โปรเซสเซอร์ YAML ที่กว้างขึ้น แต่ที่นี่ปฏิเสธด้วยเหตุผลด้านความปลอดภัยหรือรูปร่างที่ไม่เกี่ยวข้องกับแกนหลักที่ดู JSON
โหลด JSON ปกติผ่านโปรแกรมอ่าน YAML 1.2 นี้ ส่วนขยายที่ไม่รองรับจะล้มเหลวด้วยเหตุผลที่แยกจากกัน
สคีมาที่เลือกจะสร้างค่าที่มีรูปทรง JSON ได้แก่ สตริง ตัวเลข บูลีน ค่าว่าง อาร์เรย์ และการแมป การจัดตำแหน่งนี้ทำให้สามารถแยกวิเคราะห์แล้วทำให้เป็นอนุกรมได้ แทนที่จะใช้การแทนที่เครื่องหมายวรรคตอน ซอร์สโค้ดไม่ได้กำหนดทุกถ้อยคำหรือข้อผิดพลาดของข้อกำหนด YAML ดังนั้นบทความจึงรายงานพฤติกรรมที่ได้รับการทดสอบ แทนที่จะอ้างว่ามีความสอดคล้องครบถ้วนสมบูรณ์
ภายใต้โหมดเข้มงวด เครื่องหมายตัวหนอน ค่าว่าง และ `0o755` จะคงสตริงไว้ สิ่งเหล่านี้คือโทเค็น YAML ที่ JSON จะไม่มีอยู่ คอร์จะแก้ไขมันแตกต่างออกไปในขณะที่ยังคงส่งคืนเอาต์พุตที่มีรูปทรง JSON
สคีมาที่จัดส่งสอดคล้องกับข้อมูลที่มีรูปทรง JSON โดยไม่ต้องพิสูจน์ขอบข้อกำหนดทุกประการ
คีย์การแมป YAML ที่ซ้ำกันจะเก็บค่าสุดท้ายพร้อมคำเตือน การตีความที่เข้มงวดในที่อื่นอาจปฏิเสธได้ ผู้อ่าน YAML 1.1 แบบเดิมสามารถพิมพ์คำต่างๆ เช่น `NO` ได้แตกต่างกัน ในขณะที่ตัวอ่านนี้จะเก็บคำเหล่านั้นไว้เป็นสตริง ความแตกต่างเหล่านั้นทำให้คำแถลงการพกพาในวงกว้างมีความซับซ้อน
แท็บที่ใช้เป็นการเยื้องจะทำให้เกิดข้อผิดพลาด ในขณะที่แท็บภายในสตริง JSON เครื่องหมายคำพูดจะถูกหลีกหนี ค่าที่ลึกมากหรือมีขนาดใหญ่เกินไปอาจกระทบถึงขีดจำกัดความปลอดภัยในพื้นที่ได้ ความสัมพันธ์ทางภาษาเชิงทฤษฎีไม่ได้แทนที่ขอบเขตการใช้งาน
คีย์ที่ซ้ำกันและความแตกต่างของพาร์เซอร์แบบเดิมยังคงเป็นขอบเขตในการทำงานร่วมกัน
การย้อนกลับเป็นเท็จอย่างชัดเจนสำหรับไปป์ไลน์ค่านี้ ความคิดเห็น YAML ไม่มีการเป็นตัวแทน JSON นามแฝงแก้ไขเป็นข้อมูลที่ซ้ำ สตรีมหลายเอกสารกลายเป็นอาร์เรย์ และแท็กที่ไม่สนับสนุนจะถูกปฏิเสธ สเกลาร์แบบบล็อกกลายเป็นสตริง แต่การนำเสนอหายไป
แม้แต่เอกสาร YAML ที่สนับสนุนก็สามารถแปลงเป็น JSON ที่ถูกต้องได้ และจะไม่กลับไปเป็นข้อความ YAML เดิมอีก ความเท่าเทียมกันของข้อมูลอาจคงอยู่ได้แม้จะเป็นค่าทั่วไป ในขณะที่ความคิดเห็น จุดยึด การสะกดคำ และตัวตนของสตรีมไม่เป็นเช่นนั้น
สิ่งนี้มีความหมายต่อการแปลง — JSON ถึง YAML คือการเปลี่ยนสไตล์ YAML เป็น JSON คือการแปลที่อาจทำให้ข้อมูลสูญหายได้
JSON-to-YAML โดยปกติจะเป็นการเปลี่ยนแปลงสไตล์และการทำให้เป็นอนุกรมสำหรับอินพุตที่มีรูปทรง JSON YAML-to-JSON ตีความไวยากรณ์เฉพาะของ YAML ก่อน จากนั้นจึงฉายผลลัพธ์ลงในโมเดลค่าที่น้อยกว่าของ JSON ทิศทางไม่สมมาตร
ToolAcre ทดสอบเอกสาร JSON-to-YAML-to-JSON ธรรมดาที่มีค่าที่ซ้อนกัน, Unicode, nulls, อาร์เรย์ และสตริงที่ดูไม่ชัดเจน ฟิกซ์เจอร์เหล่านั้นพิสูจน์คลาสข้อมูลที่ครอบคลุม ไม่ใช่ทุกคู่โปรเซสเซอร์ JSON หรือ YAML ที่เป็นไปได้
ตัวอย่างการทำงาน: เอกสาร JSON โหลดเป็น YAML — โครงสร้างเดียวกัน จากนั้นเพิ่มฟีเจอร์ YAML เท่านั้นเพื่อแสดงตำแหน่งที่เครื่องมือ JSON หยุด
วาง `{"country":"NO","items":[1,null],"nested":{"ok":true}}` เป็นอินพุต YAML ผู้อ่านที่เข้มงวดส่งคืนต้นไม้เดียวกัน เพิ่มความคิดเห็น YAML และค่าจะยังคงเหมือนเดิมในขณะที่ความคิดเห็นหายไป แทนที่วัตถุที่ทำซ้ำด้วยสมอและนามแฝง ขณะนี้ JSON มีสำเนามากกว่าไวยากรณ์อ้างอิง
เพิ่ม `---` และเอกสารที่สอง ผลลัพธ์จะกลายเป็นอาร์เรย์ของเอกสารพร้อมคำเตือน เพิ่ม `!!binary`; ผู้อ่านที่ถูกจำกัดจะปฏิเสธ แต่ละขั้นตอนจะมีขอบเขตที่แตกต่างกัน: การนำเสนอที่ถูกละเว้น โครงสร้างที่ได้รับการแก้ไข รูปแบบการสตรีม และประเภทที่ไม่รองรับ
สิ่งนี้ไม่ครอบคลุม — ความเข้ากันได้ระดับสคีมา โดยที่ประเภท YAML เช่นการประทับเวลาไม่มี JSON ที่เหมือนกัน
ความเข้ากันได้ของสคีมาไม่ได้เกี่ยวกับไวยากรณ์ของพื้นผิวเท่านั้น Core สามารถสร้าง Infinity หรือ NaN ซึ่ง JSON เขียนเป็น null พร้อมคำเตือน การประทับเวลาและแท็กไบนารี่จะถูกปฏิเสธภายใต้สคีมาที่ถูกจำกัด แทนที่จะแปลง ToolAcre จงใจจำกัด YAML ให้เหลือเพียงข้อมูลที่มีรูปทรง JSON ที่ปลอดภัย
การใช้งาน YAML อื่นอาจสนับสนุนประเภทเพิ่มเติม นั่นทำให้เข้ากันได้กับค่า JSON ธรรมดาที่จุดเหล่านั้นได้น้อยลง ไม่ใช่ดีขึ้นหรือแย่ลงโดยอัตโนมัติ เลือกตามสัญญาเป้าหมายและข้อกำหนดด้านความปลอดภัย
ความเข้ากันได้ระดับสคีมาประกอบด้วยค่าที่ไม่สิ้นสุดและแท็กชั่วคราวที่ผู้อ่านที่ถูกจำกัดนี้จำกัดหรือปฏิเสธ
ข้อมูลรูป JSON ธรรมดาส่งผ่านอย่างสมบูรณ์ผ่านตัวอ่านและตัวเขียน YAML 1.2 นี้ การกล่าวอ้างที่กว้างขึ้นเกี่ยวกับเอกสารหรือตัวแยกวิเคราะห์ทั้งหมดจำเป็นต้องมีโปรแกรมติดตั้งที่ครอบคลุมคีย์ที่ซ้ำกัน เวอร์ชันสคีมา แท็ก และขีดจำกัดของทรัพยากร
ใช้ตัวแปลงไวยากรณ์เพื่อทดสอบข้อความจริงและอ่านคำเตือน ถือว่า “JSON คือ YAML” เป็นการชวเลขที่มีประโยชน์หลังจากตั้งชื่อ parser, schema และฟีเจอร์ที่ไม่รองรับซึ่งทำให้ขอบเขตที่แท้จริงมีความแม่นยำเท่านั้น
สำหรับการทดสอบความสามารถในการพกพา ให้เก็บฟิกซ์เจอร์หนึ่งรายการไว้ในโมเดลมูลค่าของ JSON ทั้งหมด และอีกรายการหนึ่งที่เพิ่มฟีเจอร์ YAML ทีละรายการเท่านั้น ดำเนินการทั้งสองผ่านผู้บริโภคแต่ละราย ขั้นแรกวัดการอ้างสิทธิ์เซตย่อยในทางปฏิบัติ ส่วนที่สองจะระบุอย่างชัดเจนว่าความคิดเห็น นามแฝง สตรีม แท็ก หรือกฎสเกลาร์แยกจากกันที่ใด วิธีการแบบเป็นขั้นนี้มีข้อมูลมากกว่าการถามว่าสองภาษาเป็นส่วนย่อยในบทคัดย่อหรือไม่ เนื่องจากจะทำให้เกิดความล้มเหลวที่เชื่อมโยงกับ parsers ที่ระบบของคุณใช้จริง