ไทย

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

การแมป XML ถึง JSON: คุณลักษณะ โหนดข้อความ และปัญหาแบบหนึ่งต่อหลาย

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

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

รายการ XML หนึ่งรายการที่แมปกับออบเจ็กต์ในขณะที่รายการที่ซ้ำกันแมปกับอาร์เรย์
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

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

เหตุใด <item> หนึ่งรายการจึงกลายเป็นวัตถุและอีกสองรายการกลายเป็นอาร์เรย์ - ฟีด XML ที่รูปร่าง JSON เปลี่ยนแปลงขึ้นอยู่กับจำนวนรายการที่มี

ฟีดที่มี `<item>one</item>` สร้าง `"item": "one"`; การเพิ่มพี่น้องคนที่สองจะเปลี่ยนคุณสมบัตินั้นเป็น `"item": ["one", "two"]` โปรแกรมแยกวิเคราะห์ไม่สามารถอนุมานได้ว่ารายการหนึ่งเป็นรายการตามแนวคิด เนื่องจากทั้งสองความหมายมีไวยากรณ์ XML ที่เหมือนกัน โค้ดที่สร้างโดยเทียบกับตัวอย่างแรกเท่านั้นจึงอาจล้มเหลวได้เมื่อการผลิตส่งตัวอย่างที่สอง

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

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

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

ผู้อ่านรายนี้จะทิ้งคำประกาศ ความคิดเห็น และคำแนะนำในการดำเนินการ คำนำหน้าเนมสเปซยังคงเป็นคำต่อคำแทนที่จะได้รับการแก้ไข: `<ns:item>` จะกลายเป็นคีย์ `ns:item` ในขณะที่ `xmlns:ns` จะกลายเป็น `@xmlns:ns` ข้อความแบบผสมถูกรวมเข้าด้วยกันภายใต้คีย์เดียว ดังนั้นตำแหน่งเดิมรอบๆ องค์ประกอบลูกจึงหายไป และคำเตือนแจ้งว่าการแปลงไม่สามารถไปกลับได้

แบบแผนแอตทริบิวต์ - คำนำหน้าเช่น @ หรือ $ เหตุใดจึงมีอยู่ และวิธีที่แอตทริบิวต์และองค์ประกอบลูกที่มีชื่อเดียวกันขัดแย้งกัน

แอตทริบิวต์ใช้คำนำหน้า `@` `<user id="7"><id>other</id></user>` กลายเป็นวัตถุที่มี `@id` เท่ากับ `"7"` และลูก `id` เท่ากับ `"other"` คำนำหน้าป้องกันไม่ให้โครงสร้าง XML สองโครงสร้างที่แตกต่างกันเกิดการชนกันในคุณสมบัติของอ็อบเจ็กต์เดียว นอกจากนี้ยังกลายเป็นส่วนหนึ่งของสัญญาของตัวแปลงเมื่อ JSON ถูกเขียนกลับไปยัง XML

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

แบบแผนของโหนดข้อความ — #text หรือ _ สำหรับเนื้อหาองค์ประกอบ และจะเกิดอะไรขึ้นเมื่อองค์ประกอบมีทั้งข้อความและลูก

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

เนื้อหาแบบผสมยังคงสูญเสีย ใน `<p>before<b>bold</b>after</p>` ตำแหน่ง "ก่อน" และ "หลัง" ที่สัมพันธ์กับรายการย่อยไม่สามารถสร้างขึ้นใหม่ได้จากคุณสมบัติ `#text` ที่รวมเข้าด้วยกัน เครื่องมือจะตรวจจับรูปแบบโครงสร้างนั้นและเตือน ใช้ XML API แบบรักษาโหนดเมื่อการเรียงลำดับเอกสารเป็นส่วนหนึ่งของความหมาย

ปัญหาแบบหนึ่งต่อหลาย - องค์ประกอบที่ซ้ำกันกลายเป็นอาร์เรย์เมื่อทำซ้ำเท่านั้น และทำไมผู้บริโภคจึงต้องเขียนโค้ดเชิงป้องกัน

พี่น้องที่ทำซ้ำจะกลายเป็นอาร์เรย์หลังจากสังเกตการทำซ้ำเท่านั้น `<book>` เดียวคือหนึ่งวัตถุ หนังสือสองเล่มเป็นอาร์เรย์ของวัตถุ บางครั้งเรียกว่าปัญหาแบบหนึ่งต่อหลายปัญหา แต่ไม่ใช่ข้อบกพร่องของพาร์เซอร์ เอกสารต้นฉบับไม่มีการประกาศรายการโดยไม่ขึ้นกับเหตุการณ์ที่เกิดขึ้น

ผู้ใช้ที่มีการป้องกันสามารถปรับเส้นทางที่รู้จักให้เป็นมาตรฐานด้วยความรู้เกี่ยวกับสคีมา: ตัด `catalogue.book` เมื่อยังไม่มีอาร์เรย์ อย่าใช้กฎนั้นกับทุกคุณสมบัติ เนื่องจากสเกลาร์ธรรมดาไม่ควรกลายเป็นรายการสำหรับความสมมาตรเท่านั้น ตัวแปลงจงใจหลีกเลี่ยงการประดิษฐ์ข้อมูลโดเมนดังกล่าว

ตัวอย่างการทำงาน: การแปลงเอกสารสไตล์ RSS ขนาดเล็ก — แอตทริบิวต์ องค์ประกอบที่ซ้ำกัน และเนมสเปซ โดยที่ผลลัพธ์ JSON มีคำอธิบายประกอบ

แปลง `<feed xmlns:m="https://example.invalid/meta"><item id="1"><m:title>One</m:title></item><item id="2"><m:title><![CDATA[Two & More]]></m:title></item></feed>` รากคือ `feed`; `@xmlns:m` ยังคงประกาศเนมสเปซไว้ `item` เป็นอาร์เรย์ แต่ละ `@id` เป็นข้อความ และชื่อที่สองประกอบด้วย `#cdata`

การอนุมานประเภทจะปิดอยู่ตามค่าเริ่มต้น ดังนั้นแม้ `id="2"` จะยังคงสตริง `"2"` ไว้ การเปิดใช้งานการอนุมานช่วยให้ parser อ่านตัวเลขและข้อความบูลีนเป็นประเภท JavaScript เหล่านั้น แต่ XML ไม่ได้ประกาศเจตนานั้น ตัวเลือกนี้เป็นเพียงการเดาที่ควบคุมโดยผู้ใช้ ไม่ใช่หลักฐานที่มาจากเอกสาร

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

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

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

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

ถือว่าผลลัพธ์เป็นการแมปที่บันทึกไว้ของ ToolAcre: `@` สำหรับแอตทริบิวต์ `#text` สำหรับข้อความองค์ประกอบแบบผสม `#cdata` สำหรับ CDATA อาร์เรย์หลังพี่น้องที่ซ้ำกันและคำนำหน้าเนมสเปซตามตัวอักษร กฎเหล่านั้นทำให้สามารถคาดเดาผลลัพธ์ได้โดยไม่ต้องแกล้งทำเป็นว่า XML และ JSON แบ่งปันแบบจำลองข้อมูลเดียว

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

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