ไทย

เครื่องมือสำหรับนักพัฒนา · ตัวแปลงไวยากรณ์

การบังคับประเภท YAML ถึง JSON: ใช่ ไม่ใช่ และ 0777 เปลี่ยนความหมายอย่างไร

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

yaml json ข้อมูลรูปแบบ

YAML โทเค็นสเกลาร์ที่แยกออกเป็นสตริง ตัวเลข บูลีน และโมฆะ
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

YAML แก้ไขสเกลาร์ที่ไม่มีเครื่องหมายคำพูดเป็นประเภท และกฎจะแตกต่างกันระหว่าง YAML 1.1 และ 1.2 โพสต์นี้แสดงให้เห็นอย่างชัดเจนถึงวิธีที่ตัวแปลงตัดสินใจว่าค่าเป็นบูลีน จำนวนเต็ม ทศนิยม หรือสตริง และวิธีการควบคุมผลลัพธ์

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

ค่าเช่น `NO` อาจกลายเป็นเท็จในตัวโหลด YAML 1.1 ได้ แต่นั่นไม่ใช่สิ่งที่ตัวแปลงนี้จัดส่งมา ทั้งสองตัวเลือก ToolAcre ใช้สคีมา YAML 1.2 ดังนั้น `NO`, `yes`, `no`, `on` และ `off` ยังคงเป็นสตริง ช่องเปิดที่ได้รับการแก้ไขมีความสำคัญเนื่องจากตัวอย่างที่อ้างว่าแผงนี้เปลี่ยน `NO` เป็นจริงหรือเท็จจะสอนสิ่งที่ตรงกันข้ามกับพฤติกรรมที่ทดสอบ

ประเภทเซอร์ไพรส์ยังคงมีอยู่ ภายใต้สคีมา JSON เริ่มต้น `null` จะเป็นโมฆะ ในขณะที่ `~` ค่าว่างและ `0o755` ยังคงเป็นสตริง การเลือก Core จะเปลี่ยนรูปแบบทั้งสามนั้นเป็น null, null และ 493 เอาต์พุตมีประโยชน์อย่างแน่นอน เนื่องจากจะแสดงค่า JavaScript ที่ได้รับการแก้ไขแล้ว แทนที่จะแสร้งทำเป็นว่าโทเค็น YAML ธรรมดาทุกอันมีประเภทที่ชัดเจน

ค่าที่คงข้อความไว้ต่ำกว่า YAML 1.2

การแก้ไขโดยนัยเกิดขึ้นในขณะที่ js-yaml อ่านแหล่งที่มา สคีมาแบบจำกัดที่เลือกจะตัดสินว่าสเกลาร์ธรรมดาตรงกับรูปแบบว่าง บูลีน หรือตัวเลข ก่อนที่ตัวแปลงจะเขียน JSON การอ้างถึงข้ามการตัดสินใจนั้น: `"0o755"` เป็นข้อความภายใต้สคีมาใด ๆ และสเกลาร์บล็อกยังคงเป็นสตริงซึ่งรวมถึงตัวแบ่งบรรทัดที่แสดงโดยตัวบ่งชี้ chomping

นี่คือการแยกวิเคราะห์และการทำให้เป็นอนุกรม ไม่ใช่การแทนที่นิพจน์ทั่วไป เครื่องอ่านจะสร้างสตริง ตัวเลข บูลีน ค่าว่าง อาร์เรย์ และอ็อบเจ็กต์ `JSON.stringify` จากนั้นปล่อยค่าเหล่านั้นด้วยการเยื้องที่เลือก ความคิดเห็นและการสะกดโทเค็นได้หมดไปแล้วในขั้นตอนการเขียน ดังนั้นจึงไม่มีซีเรียลไลเซอร์ที่สามารถสร้างใหม่ได้ว่าตัวเลขเดิมเป็นทศนิยมหรือเขียนในรูปแบบ YAML ที่ยอมรับอื่น

กฎ YAML 1.1 — yes/no/on/off booleans, 0777 เป็นฐานแปด, 1:30 เป็น sexagesimal และสตริงเวอร์ชัน เช่น 1.10 อ่านเป็นแบบลอย

โครงร่างแสดงรายการ YAML 1.1 การบังคับ เช่น เวลา sexagesimal และฐานแปดแบบเดิม สิ่งเหล่านี้เป็นอันตรายต่อความเข้ากันได้ที่เกี่ยวข้อง แต่ไม่มีโหมดให้เลือกที่นี่ ToolAcre จงใจไม่เสนอสคีมา 1.1 UI ระบุว่าไม่มีตัวเลือกที่ส่งมาอ่าน `NO` ว่าเป็นเท็จ และทดสอบการปักหมุดรหัสประเทศนั้นและคำว่าใช่ ไม่ใช่ เปิดและปิดเป็นสตริง

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

YAML 1.1 การบังคับขู่เข็ญเป็นอันตรายที่ตัวแปลงนี้หลีกเลี่ยง

สคีมา JSON เริ่มต้นยอมรับเฉพาะการสะกดแบบสเกลาร์ที่เข้ากันได้กับโมเดลของ JSON เท่านั้น Core เพิ่มรูปแบบ null YAML ที่คุ้นเคย, เลขฐานสิบหกและจำนวนเต็มฐานแปด, Infinity และ NaN แกนหลักยังคงอยู่ในตัวโหลดแบบจำกัด: แท็กอ็อบเจ็กต์เฉพาะภาษา วันที่ ชุด แผนที่ที่เรียงลำดับ และแท็กไบนารี่จะถูกปฏิเสธแทนที่จะสร้างขึ้น

Infinity และ NaN เผยอีกขอบเขตหนึ่ง JavaScript สามารถถือไว้ได้ แต่ JSON ไม่สามารถเขียนได้ ตัวแปลงจะระบุแต่ละเส้นทางและเตือนว่าค่าจะกลายเป็นโมฆะ นั่นเป็นขั้นตอนที่สูญเสียที่ยอมรับ ไม่ใช่การแปลงที่ไม่มีการสูญเสีย เครื่องหมายคำพูด `.inf` หลีกเลี่ยงเนื่องจากค่านั้นยังคงเป็นสตริงตัวอักษร `.inf`

สคีมา YAML 1.2 ที่จัดส่งทั้งสองแบบแตกต่างกันเฉพาะในแบบฟอร์มสเกลาร์ที่จัดทำเป็นเอกสารเท่านั้น

วาง `tilde: ~`, `empty:`, `octal: 0o755`, `country: NO` และ `answer: yes` เมื่อเลือกอย่างเข้มงวด ค่า JSON จะเป็น `"~"`, `""`, `"0o755"`, `"NO"` และ `"yes"` เมื่อเลือก Core จะมีเพียงการเปลี่ยนแปลงสามรายการแรกเท่านั้น: ตัวหนอนและค่าว่างจะกลายเป็นค่าว่าง และเลขฐานแปดจะกลายเป็น 493 ข้อความประเทศและคำตอบอยู่ในเอาต์พุตทั้งสอง

ตอนนี้เสนอราคาทุกค่าแล้วทำซ้ำ สคีมาทั้งสองส่งคืนสตริงเนื่องจากแหล่งที่มาระบุประเภทที่ต้องการ การเปรียบเทียบนี้มีความแม่นยำของโค้ดและมีประโยชน์มากกว่าการเปรียบเทียบ YAML 1.1 กับ 1.2 ภายในเครื่องมือที่ไม่เคยโหลด 1.1 นอกจากนี้ยังให้ฟิกซ์เจอร์ที่ตรวจสอบได้สำหรับการตรวจสอบ parser อื่นโดยไม่ต้องเดาจากเอกสารประกอบเพียงอย่างเดียว

ตัวอย่างการทำงาน: หนึ่งไฟล์ภายใต้สกีมาที่เข้มงวดและคอร์ของ ToolAcre

แท็กมาตรฐานที่ชัดเจนจะยอมรับก็ต่อเมื่อสคีมาแบบจำกัดจดจำแท็กเหล่านี้ได้: `!!str 123` กลายเป็นสตริง `123` ในขณะที่ `!!int "7"` กลายเป็นตัวเลข 7 แท็ก เช่น `!!binary`, `!!timestamp`, `!!set`, `!!js/function` และตัวสร้างอ็อบเจ็กต์ Python ถูกปฏิเสธ สิ่งนี้จะป้องกันไม่ให้ผู้อ่าน YAML กลายเป็นโรงงานวัตถุโดยพลการ

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

สิ่งนี้ไม่ครอบคลุม — การแยกวิเคราะห์ระดับแอปพลิเคชันของผลลัพธ์ JSON ซึ่งอาจบังคับให้พิมพ์อีกครั้ง (เช่น สตริง '1' เป็นตัวเลข)

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

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

ประเด็นสำคัญ: อ้างอิงอะไรก็ตามที่เครื่องอาจอ่านผิด — และการแปลง YAML เป็น JSON ในเบราว์เซอร์จะเผยให้เห็นสิ่งที่สเกลาร์แต่ละค่าแก้ไขได้อย่างไร

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

แผงทำให้ตัวเลือก parser มองเห็นได้ และส่งคืนคำเตือนสำหรับค่าที่ไม่มีเป้าหมายสามารถเป็นตัวแทนได้ นั่นคือคำสัญญาที่ตรงไปตรงมา: มันเผยให้เห็นว่าการดำเนินการนี้แก้ไขแต่ละสเกลาร์ได้อย่างไร มันไม่ได้อ้างถึงพฤติกรรมสากล YAML หรือรักษาความคิดเห็น แท็ก และการสะกดคำตลอดการเดินทางไปกลับ