JSON กับ XML แปลงได้สองทาง
- ไม่ต้องสมัครสมาชิก
- ฟรี 100%
- ไม่เก็บข้อมูลบนเซิร์ฟเวอร์
วางอันไหนก็ได้แล้วได้อีกอันกลับมา การแปลงระหว่างสองรูปแบบนี้ไม่มีคำตอบเดียวที่ถูก เพราะ XML มีทั้ง attribute อิลิเมนต์ที่ซ้ำชื่อกัน และข้อความที่ปนอยู่กับลูก ส่วน JSON ไม่มีสักอย่าง ตัวแปลงทุกตัวจึงต้องเลือกกติกาของตัวเอง และส่วนใหญ่ไม่บอก คนถึงได้มาพบทีหลังว่าอิลิเมนต์ที่ซ้ำกันสามอันเหลือค่าเดียว กติกาของเราเขียนไว้ใต้เครื่องมือ และมีเทสที่พาเอกสารข้ามไปอีกฝั่งแล้วแปลงกลับ เพื่อพิสูจน์ว่ามันกลับมาเหมือนเดิม
ปิดไว้โดยปริยาย XML ไม่มีชนิดข้อมูล เลข 42 จึงเป็นตัวอักษรสามตัวจนกว่าจะมีใครตัดสินเป็นอย่างอื่น และค่าที่ขึ้นต้นด้วยศูนย์จะไม่ถูกอ่านเป็นตัวเลขเด็ดขาด
วาง JSON หรือ XML เพื่อเริ่มแปลง
กติกาที่การแปลงนี้ใช้
เขียนไว้ให้พึ่งพาได้ และมีเทสยืนยันว่าใช้ได้จริงทั้งสองทิศทาง
<b>text</b>กลายเป็น{ "b": "text" }<b id="1">text</b>กลายเป็น{ "b": { "@id": "1", "#text": "text" } }<a><c>1</c><c>2</c></a>กลายเป็น{ "a": { "c": ["1", "2"] } }<b/>กลายเป็น{ "b": "" }คำถามที่พบบ่อย
ทำไมต้องประกาศกติกาการแปลงด้วย
เพราะ XML แสดงสิ่งที่ JSON แสดงไม่ได้ อิลิเมนต์หนึ่งมีทั้ง attribute มีลูก และมีข้อความลอย ๆ พร้อมกันได้ และชื่อเดียวกันปรากฏสามครั้งติดกันได้ ส่วน JSON มีแค่ออบเจกต์กับอาร์เรย์ จึงต้องมีอะไรสักอย่างยอม ที่นี่ attribute กลายเป็นคีย์ที่มี @ นำหน้า ข้อความลอย ๆ กลายเป็น #text และชื่อที่ซ้ำเกินหนึ่งครั้งกลายเป็นอาร์เรย์ การรู้กติกานี้คือความต่างระหว่างการแปลงที่เอาไปเขียนสคริปต์ต่อได้ กับการแปลงที่ต้องมานั่งตรวจเองทุกครั้ง
ข้อมูลของฉันถูกอัปโหลดไหม
ไม่ การแปลงทั้งสองทางทำงานในแท็บนี้ นโยบายความปลอดภัยของเว็บกำหนด connect-src ‘none’ เบราว์เซอร์จึงบล็อกการเรียกเครือข่ายจากหน้านี้ ต่อให้โค้ดอยากส่งเอกสารออกไปก็ส่งไม่ได้ เรื่องนี้สำคัญเพราะ XML ที่คนเอามาแปลงมักเป็นใบกำกับภาษี เอกสารยื่นภาษี หรือข้อความที่ระบบคุยกันเอง
ทำไมเลข 42 ที่ออกมาจาก XML กลายเป็นสตริง
เพราะใน XML มันคือตัวอักษรสามตัว ไม่มีอะไรมากกว่านั้น ตัวแปลงที่ตัดสินว่ามันคือเลข 42 ก็จะตัดสินว่าเลขที่ใบสั่งซื้อ 007 คือเลข 7 และราคา 1.50 คือ 1.5 ด้วย คุณเปิดการอ่านตัวเลขได้จากช่องติ๊ก และถึงเปิดแล้ว ค่าที่แปลงกลับออกไปแล้วไม่เหมือนเดิมก็จะยังถูกเก็บเป็นข้อความอยู่ดี
อ่าน DOCTYPE ได้ไหม
ระบบข้ามมันไปโดยตั้งใจ DTD ประกาศ entity ที่มีค่าเป็นเนื้อหาของไฟล์ในเครื่องได้ หรือประกาศตัวที่ขยายตัวเองเป็นพันล้านชุดได้ ทั้งสองอย่างคือวิธีคลาสสิกที่ตัวอ่าน XML ถูกใช้เป็นอาวุธ ที่นี่ไม่มีการแปลง entity ที่ไม่ได้รู้จักมาแต่แรก และ entity ที่ไม่รู้จักจะถูกทิ้งไว้ตามที่เขียนมา ไม่ใช่ลบทิ้ง
คอมเมนต์กับ namespace เป็นยังไง
คอมเมนต์ถูกตัดทิ้ง เพราะ JSON ไม่มีที่ให้เก็บ ส่วน namespace prefix ยังติดอยู่กับชื่ออิลิเมนต์ ns:price จึงยังเป็น ns:price และแปลงกลับได้เหมือนเดิม ตัวประกาศ namespace เองก็ถูกเก็บเป็น attribute ธรรมดาด้วยเหตุผลเดียวกัน
ระบบไม่ยอมรับ JSON ของฉันเพราะมีคีย์ระดับบนสุดหลายอัน
XML มีรากได้อันเดียว ออบเจกต์ที่มีสองคีย์จึงไม่มีรูปแบบ XML ที่ชัดเจนแน่นอน การตั้งชื่อรากให้เองจะทำให้การแปลงกลับกลายเป็นเรื่องโกหก ระบบจึงขอให้คุณห่อมันด้วยรากที่คุณต้องการเอง