ไทย

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

คุณลักษณะ YAML หายไปในการแปลง JSON: ความคิดเห็น จุดยึด และแท็ก

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

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

YAML ความคิดเห็นและจุดยึดจางหายไปในขณะที่ข้อมูลที่แก้ไขแล้วยังคงอยู่ใน JSON
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

YAML มีความคิดเห็น แองเคอร์ นามแฝง คีย์รวม แท็ก และสตรีมหลายเอกสาร JSON ไม่มีเลย โพสต์นี้จะอธิบายว่าตัวแปลงทำอะไรกับแต่ละไฟล์ และเหตุใดการแปลงกลับจึงไม่คืนค่าไฟล์ต้นฉบับ

ไฟล์กลับมานานขึ้นและไม่มีความคิดเห็นแม้แต่น้อย - การกำหนดค่า YAML แปลงเป็น JSON และกลับมา และทุกอย่างที่ไม่รอด

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

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

ความคิดเห็น — ทำไม JSON ไม่มีที่สำหรับพวกเขา และทุกๆ # บรรทัดก็หายไปหลังจากการแปลง

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

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

จุดยึดและนามแฝง — &default และ *default ขยายเป็นสำเนาซ้ำ และผลลัพธ์ของไฟล์จะขยายอย่างไร

แองเคอร์และนามแฝงได้รับการยอมรับภายในขีดจำกัดความปลอดภัย จากนั้นจึงแก้ไข `base: &b {x: 1}` และ `copy: *b` กลายเป็นสองเส้นทางวัตถุที่มี `x: 1` เอาต์พุต YAML ใช้ `noRefs` ดังนั้นเอกลักษณ์ของวัตถุที่ใช้ร่วมกันจึงไม่สร้างจุดยึดใหม่ ความสัมพันธ์แบบกระชับจะหายไปแม้ว่าค่าที่ซ้ำกันจะยังคงอยู่ก็ตาม

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

ผสานคีย์ - <<: แบบแผนจาก YAML 1.1 วิธีที่ parsers ที่สนับสนุนมันทำให้การแมปที่ผสานเรียบขึ้น และสิ่งที่เกิดขึ้นในอันที่ไม่

โครงร่างถือว่า YAML 1.1 คีย์ผสานถูกทำให้เรียบ ToolAcre โหลดเฉพาะ JSON หรือ Core schema ของ js-yaml เท่านั้น ซึ่งทั้งสองอย่างนี้ไม่ได้เปิดใช้งานประเภทการผสาน ภายใต้สคีมาเหล่านี้ คีย์ `<<` จะเป็นข้อมูลธรรมดาแทนที่จะเป็นคำสั่งในการรวมการแมป การนำเสนอการผสานแบบแบนเนื่องจากลักษณะการจัดส่งจึงเป็นเท็จ

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

คีย์ผสานไม่ได้เปิดใช้งานโดยสคีมาแบบจำกัดสองแบบที่ตัวแปลงนี้จัดส่งมา

แท็กที่ชัดเจนมาตรฐานที่สคีมาจำกัดรู้จักสามารถเลือกประเภทพื้นฐานได้ เช่น `!!str` หรือ `!!int` แท็กที่กำหนดเองและสมบูรณ์ยิ่งขึ้น รวมถึงไบนารี การประทับเวลา ชุด ​​แผนที่เรียงลำดับ ฟังก์ชัน JavaScript และตัวสร้างอ็อบเจ็กต์ Python จะถูกปฏิเสธ พวกเขาไม่ได้เข้มงวดและไม่เคยถูกดำเนินการ

ยอมรับสตรีม YAML คั่นด้วย `---` เอกสารหนึ่งฉบับกลายเป็นหนึ่งค่า หลายรายการกลายเป็นอาร์เรย์พร้อมคำเตือนการตั้งชื่อจำนวนเอกสาร ตัวคั่นต่อท้ายสามารถสร้างเอกสารสุดท้ายที่ว่างเปล่าตามสคีมาที่เลือก ไม่มีเป้าหมายที่นี่ที่มีโมเดลสตรีม ดังนั้นอาเรย์จึงเป็นแบบแผนที่ประกาศไว้

แท็กที่ไม่ปลอดภัยจะถูกปฏิเสธ สตรีมหลายเอกสารกลายเป็นอาร์เรย์

ใช้ `defaults: &d` ด้วยการลองอีกครั้งและหมดเวลา ความคิดเห็นที่อธิบายการหมดเวลา จากนั้น `service:` กับ `inherited: *d` JSON มีทั้งค่าเริ่มต้นและวัตถุที่สืบทอดซ้ำ ไม่มีความคิดเห็นและชื่อจุดยึด การแปลง JSON ด้านหลังนั้นจะส่งเสียงการแมปสองครั้งแทนที่จะเป็นความสัมพันธ์แบบจุดยึด

เพิ่ม `---` ตามด้วยเอกสารอื่น และราก JSON จะกลายเป็นอาร์เรย์ของเอกสาร เพิ่ม `!!binary` และ Conversion หยุดด้วยคำแนะนำสคีมาแบบจำกัด การเปลี่ยนแปลงทั้งสามนี้แยกแยะความแตกต่างระหว่างข้อมูลที่ได้รับการแก้ไขแล้ว แบบแผนเชิงโครงสร้าง และการก่อสร้างที่ไม่ได้รับการสนับสนุนโดยสิ้นเชิง

สิ่งนี้ไม่ครอบคลุมถึง - ลำดับคีย์และรูปแบบการเสนอราคา ซึ่งมักจะยังคงอยู่แต่ไม่รับประกันด้วยรูปแบบใดรูปแบบหนึ่ง

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

ผู้เขียนปกป้องสตริงที่ไม่ชัดเจนโดยการอ้างอิงค่าที่ผู้บริโภค YAML 1.1 อาจอ่านผิด แต่ตัวเลือกด้านความปลอดภัยนั้นอาจแตกต่างไปจากรูปแบบดั้งเดิมของผู้เขียน ความเท่าเทียมกันของข้อมูลคือการทดสอบที่สามารถป้องกันได้สำหรับค่ารูป JSON ธรรมดา ความเท่าเทียมกันทางข้อความไม่ได้

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

YAML-to-JSON จะสูญเสียเมื่อใดก็ตามที่ความหมายอยู่นอกค่ารูป JSON: ความคิดเห็น นามแฝง แท็กที่ไม่รองรับ ขอบเขตการสตรีมดังกล่าว และสไตล์ ToolAcre ทำให้มองเห็นการสูญเสียหลายครั้ง และปฏิเสธโครงสร้างที่เป็นอันตรายหรือเป็นวงจร แทนที่จะแสร้งทำเป็นว่าสงวนไว้

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

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