XML থেকে JSON

আপনার ব্রাউজারে XML ডকুমেন্টকে JSON-এ রূপান্তর করুন। @-প্রিফিক্সড কীগুলোর অধীনে অ্যাট্রিবিউট রাখুন, পুনরাবৃত্ত উপাদানগুলো অ্যারেতে সংকুচিত করুন এবং ঐচ্ছিকভাবে সংখ্যা, বুলিয়ান ও null রূপান্তর করুন।

XML-কে সেই অবজেক্ট ট্রি হিসেবে পড়ুন যা এটি সবসময় হতে চেয়েছিল। একটি XML ডকুমেন্ট পেস্ট করুন এবং JSON ফিরে পান। অ্যাট্রিবিউটগুলো @-প্রিফিক্সড কীগুলোর অধীনে সংরক্ষিত হয়, পুনরাবৃত্ত উপাদানগুলো অ্যারেতে সংকুচিত হয়, এবং টাইপ কনার্শন অপ্ট-ইন, যাতে আইডেন্টিফায়ার তাদের অগ্রবর্তী শূন্য রাখে।

JSON আউটপুট

প্রতিটি XML থেকে JSON কনভার্টারকে সমাধান করতে হয় এমন তিনটি সমস্যা

অ্যাট্রিবিউটের যাওয়ার স্বাভাবিক জায়গা নেই

XML অ্যাট্রিবিউট এবং শিশু উপাদানের মধ্যে একটি দৃঢ় রেখা টানে। <user id="7"><name>Ada</name></user> <user><id>7</id><name>Ada</name></user> থেকে ভিন্ন কিছু বলে, যদিও বেশিরভাগ অ্যাপ্লিকেশন সেগুলোকে অভিন্নভাবে ব্যবহার করে। JSON-এ এই পার্থক্যের কোনো সমতুল্য নেই, তাই একটি কনভার্টারকে হয় অ্যাট্রিবিউট ফেলে দিতে হবে অথবা তাদের জন্য একটি জায়গা উদ্ভাবন করতে হবে।

ব্যাপকভাবে ব্যবহৃত কনভেনশন, এবং এখানে প্রয়োগ করা একটি, অ্যাট্রিবিউট কীগুলোকে @ দিয়ে প্রিফিক্স করে এবং একটি উপাদানে অ্যাট্রিবিউট ও কনটেন্ট দুটোই থাকলে #text-এর অধীনে উপাদান টেক্সট সংরক্ষণ করে। তাই প্রথম উদাহরণটি হয়ে যায় {"user": {"@id": "7", "name": "Ada"}}। প্রিফিক্সটি কোনো স্ট্যান্ডার্ডের অংশ নয়, কিন্তু এটি যথেষ্ট সাধারণ যে বেশিরভাগ ডাউনস্ট্রিম কোড এটি চিনতে পারে, এবং এটি রূপান্তরটিকে বিপরীতমুখী রাখে। অ্যাট্রিবিউট বন্ধ করলে পরিচ্ছন্ন আউটপুট তৈরি হয় যখন আপনি জানেন অ্যাট্রিবিউটগুলো এমন মেটাডেটা যা আপনার প্রয়োজন নেই।

একটি আইটেম নাকি একের তালিকা?

এটি এমন একটি সমস্যা যার কোনো সঠিক উত্তর নেই। XML-এ, একটি একক <item> শিশু বিশিষ্ট পিতামাতা এবং পাঁচটি বিশিষ্ট পিতামাতা কাঠামোগতভাবে একই রকম দেখায়, কিন্তু সেগুলোকে অবশ্যই যথাক্রমে একটি একক অবজেক্ট এবং একটি অ্যারে হতে হবে — এবং ডকুমেন্টে কিছুই বলে না স্কিমা কোনটি চেয়েছিল। স্কিমা ছাড়া একটি টুলকে যা দেখে তা থেকে অনুমান করতে হয়।

এখানে নিয়ম হলো পুনরাবৃত্ত সহোদর উপাদান নামগুলোকে একটি অ্যারেতে সংকুচিত করা এবং একটি একাকী উপাদানকে একক মান হিসেবে রাখা। পড়ার সময় এটি স্বজ্ঞার সাথে মেলে, কিন্তু এর মানে আউটপুট গ্রহণকারী কোডকে উভয় আকৃতি হ্যান্ডেল করতে হবে, কারণ একটি তালিকা যাতে আজ একটি এন্ট্রি থাকে একটি অবজেক্ট তৈরি করবে, এক-উপাদানের অ্যারে নয়। যখন আপনি কনজিউমার নিয়ন্ত্রণ করেন, পুনরাবৃত্তির আগে [].concat(value)-এর মতো কিছু দিয়ে নর্মালাইজ করুন।

XML-এ সবকিছু একটি স্ট্রিং

স্কিমা ছাড়া XML ডকুমেন্টে কোনো টাইপ নেই। <count>42</count> এবং <sku>0042</sku> দুটোই শুধু টেক্সট, এবং শুধুমাত্র একজন মানুষ বা একটি XSD জানে একটি সংখ্যা এবং অন্যটি এমন একটি আইডেন্টিফায়ার যা তার শূন্য রাখতে হবে।

এজন্যই টাইপ কনার্শন একটি ডিফল্টের বদলে চেকবক্স। এটি চালু থাকলে, মানগুলো কেবল তখনই রূপান্তরিত হয় যখন রাউন্ড ট্রিপটি সঠিক — একটি সংখ্যাসূচক স্ট্রিং সংখ্যা হয় শুধুমাত্র যদি এটিকে আবার ফরম্যাট করলে অভিন্ন টেক্সট তৈরি হয়, যা 0042, +7 এবং 1e999 রক্ষা করে। true, false এবং খালি উপাদান বুলিয়ান ও null হয়। এটি বন্ধ থাকলে, প্রতিটি মান স্ট্রিং থাকে, যা আইডেন্টিফায়ার, ফোন নম্বর, পোস্টকোড এবং 2^53-এর বাইরের যেকোনো পূর্ণসংখ্যার জন্য নিরাপদ পছন্দ, যেখানে জাভাস্ক্রিপ্টের সংখ্যা নির্ভুলতা নীরবে মান নষ্ট করবে।

ওপেন-সোর্স নোট: কোনো থার্ড-পার্টি লাইব্রেরি ছাড়া ভ্যানিলা জাভাস্ক্রিপ্টে বাস্তবায়িত।

সচরাচর জিজ্ঞাসা

আমার XML কি কোথাও আপলোড হয়?
না। পার্সিং ব্রাউজারের অন্তর্নির্মিত DOMParser ব্যবহার করে এবং JSON স্থানীয়ভাবে তৈরি হয়, তাই ডকুমেন্টটি কখনো পেজ ছাড়ে না।
অ্যাট্রিবিউটগুলো কীভাবে উপস্থাপিত হয়?
উপাদানটির শিশুদের পাশে @ দিয়ে প্রিফিক্সড কী হিসেবে। যদি একটি উপাদানে অ্যাট্রিবিউট এবং টেক্সট দুটোই থাকে, টেক্সটটি একটি #text কী-এর অধীনে সংরক্ষিত হয়।
একটি একক উপাদান কেন অ্যারে হলো না?
স্কিমা ছাড়া কিছুই নির্দেশ করে না একটি শিশু মানে একক মান নাকি একের তালিকা। পুনরাবৃত্ত নামগুলো অ্যারে হয়; একটি একাকী উপাদান একক মান থাকে।
টাইপ কনার্শন কী করে?
এটি সংখ্যাসূচক, বুলিয়ান এবং খালি মানগুলোকে টেক্সট থেকে রূপান্তর করে। সংখ্যাগুলো কেবল তখনই রূপান্তরিত হয় যখন রাউন্ড ট্রিপটি সঠিক, তাই 0042 এবং +7 স্ট্রিং থাকে।
কনার্শন বন্ধ রাখা উচিত?
হ্যাঁ আইডেন্টিফায়ার, ফোন নম্বর, পোস্টকোড এবং 2^53-এর বাইরের পূর্ণসংখ্যার জন্য, যেখানে জাভাস্ক্রিপ্টের সংখ্যা নির্ভুলতা সতর্কতা ছাড়াই মান গোল করবে।
কেন আমি ভুল XML ত্রুটি পাই?
ডকুমেন্টটি ভালোভাবে গঠিত নয়: বন্ধ না হওয়া বা অমিল ট্যাগ, আনস্কেপড & বা <, অথবা একাধিক রুট উপাদান সাধারণ কারণ।