Τι είναι αυτό το εργαλείο;
Το XML και το JSON είναι και τα δύο δεδομένα με δομή δέντρου, αλλά εμφανίζονται σε διαφορετικά μέρη: παλαιά enterprise APIs, υπηρεσίες SOAP, feeds RSS/Atom και πολλές μορφές διαμόρφωσης εξακολουθούν να μιλούν XML, ενώ τα σύγχρονα REST APIs και ο κώδικας JavaScript μιλούν σχεδόν αποκλειστικά JSON. Αυτό το εργαλείο μεταφράζει μεταξύ των δύο ώστε να μη χρειάζεται να γράψετε κανένα από τα δύο με το χέρι όταν ενσωματώνετε παλιά και νέα συστήματα.
Η μετατροπή είναι χτισμένη απευθείας πάνω στο DOMParser API του browser για την ανάγνωση XML, και ακολουθεί τη δομή που ορίζεται από την προδιαγραφή W3C XML 1.0 για την παραγωγή του — έτσι το XML που παράγει είναι σωστά διαμορφωμένο και το XML που δέχεται αναλύεται με τον ίδιο τρόπο που θα το αναλύσει ένας browser ή οποιαδήποτε βιβλιοθήκη XML συμβατή με τα πρότυπα.
Επειδή το XML έχει έννοιες που δεν έχει το JSON (χαρακτηριστικά, μικτό περιεχόμενο κειμένου/στοιχείων, ένα υποχρεωτικό μοναδικό ριζικό στοιχείο) και το JSON έχει έννοιες που δεν έχει το XML (native πίνακες, booleans, αριθμούς), το εργαλείο χρησιμοποιεί μια τεκμηριωμένη, ευρέως χρησιμοποιούμενη σύμβαση: ένα χαρακτηριστικό XML `name="value"` γίνεται το κλειδί JSON `"@_name": "value"`, το περιεχόμενο κειμένου ενός στοιχείου γίνεται είτε η άμεση τιμή string του στοιχείου (όταν δεν έχει θυγατρικά ή χαρακτηριστικά) είτε ένα κλειδί `"#text"` δίπλα σε τυχόν χαρακτηριστικά, και τα επαναλαμβανόμενα αδελφά στοιχεία με την ίδια ετικέτα γίνονται πίνακας JSON.
Γιατί να το χρησιμοποιήσετε;
- Αμφίδρομο — μετατρέψτε JSON σε XML ή XML σε JSON από την ίδια οθόνη.
- Χειρίζεται σωστά την ένθεση — τα ένθετα αντικείμενα JSON γίνονται ένθετα στοιχεία XML και αντίστροφα, σε οποιοδήποτε βάθος.
- Οι πίνακες αντιστοιχίζονται σε επαναλαμβανόμενα στοιχεία — ένας πίνακας JSON κάτω από ένα κλειδί γίνεται τόσα αδελφά στοιχεία XML με την ίδια ετικέτα, και οι επαναλαμβανόμενες ετικέτες XML επιστρέφουν ως πίνακας JSON.
- Τα χαρακτηριστικά XML διατηρούνται — με χρήση της σύμβασης `@_attributeName`, ώστε τα δεδομένα χαρακτηριστικών να μην απορρίπτονται σιωπηλά.
- Αντιγραφή στο πρόχειρο ή λήψη ως αρχείο .json ή .xml.
- 100% από την πλευρά του client — τίποτα από όσα επικολλάτε δεν ανεβαίνει πουθενά.
Πώς χρησιμοποιείται
- Επιλέξτε μια κατεύθυνση: "XML → JSON" ή "JSON → XML".
- Επικολλήστε τα δεδομένα σας στο πλαίσιο εισαγωγής.
- Κάντε κλικ στο "Convert".
- Ελέγξτε το αποτέλεσμα, μετά αντιγράψτε το ή κάντε κλικ στο "Download" για να αποθηκεύσετε ένα αρχείο.
Παράδειγμα
Είσοδος
{"user":{"name":"Alice","age":30}}Έξοδος
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>Alice</name>
<age>30</age>
</user>Το μοναδικό κλειδί ανώτατου επιπέδου του JSON ("user") γίνεται το ριζικό στοιχείο XML· αν το JSON έχει περισσότερα από ένα κλειδιά ανώτατου επιπέδου, το εργαλείο τυλίγει τα πάντα σε ένα στοιχείο <root> αφού το XML απαιτεί ακριβώς μία ρίζα.
Πρακτικές συμβουλές
- Μετάβαση παλαιάς διαμόρφωσης XML (όπως ένα αρχείο ρυθμίσεων παλιάς εφαρμογής) σε ένα σύγχρονο σύστημα βασισμένο σε JSON: επικολλήστε το XML, μετατρέψτε, και προσαρμόστε τα ονόματα πεδίων όπως χρειάζεται.
- Δοκιμή ενός endpoint SOAP ή XML-RPC από JavaScript: μετατρέψτε το payload αιτήματος JSON σας σε XML εδώ πριν το στείλετε, ή μετατρέψτε μια απάντηση XML πίσω σε JSON για να την επιθεωρήσετε εύκολα.
- Αν το JSON σας χρησιμοποιεί πίνακες για δεδομένα που το XML θα αναπαριστούσε ως επαναλαμβανόμενα στοιχεία, βεβαιωθείτε ότι ο πίνακας είναι πρώτα ένθετος κάτω από ένα μοναδικό κλειδί (π.χ. {"items":{"item":[1,2,3]}}) αντί για έναν γυμνό πίνακα ανώτατου επιπέδου, αφού το XML δεν μπορεί να έχει πολλαπλά ριζικά στοιχεία.
Γιατί έχει σημασία η σύμβαση χαρακτηριστικού @_
Το πιο δύσκολο κομμάτι της μετατροπής JSON/XML είναι ότι τα στοιχεία XML μπορούν να μεταφέρουν δύο είδη δεδομένων ταυτόχρονα — χαρακτηριστικά και θυγατρικό περιεχόμενο — ενώ ένα απλό αντικείμενο JSON έχει απλώς κλειδιά και τιμές. Χωρίς μια σύμβαση για να τα διαχωρίσει, ένας απλοϊκός μετατροπέας είτε θα έχανε εντελώς τα χαρακτηριστικά είτε θα τα ανακάτευε με τα θυγατρικά στοιχεία με τρόπο που δεν μπορεί να μετατραπεί αξιόπιστα πίσω. Η σύμβαση προθέματος `@_name` (που χρησιμοποιείται επίσης από ευρέως υιοθετημένες βιβλιοθήκες στο οικοσύστημα JavaScript) λύνει αυτό δίνοντας στα χαρακτηριστικά ένα ξεχωριστό, μονοσήμαντο σχήμα κλειδιού, ώστε το `<product id="42">Widget</product>` να μετατρέπεται αμφίδρομα καθαρά ως `{"product":{"@_id":"42","#text":"Widget"}}` αντί να χάνει το id ή να μαντεύει λανθασμένα ποια τιμή ήταν ποια.
Συχνές ερωτήσεις
Τι συμβαίνει με JSON που έχει περισσότερα από ένα κλειδιά ανώτατου επιπέδου;
Το XML απαιτεί ένα μοναδικό ριζικό στοιχείο, οπότε αν το αντικείμενο JSON σας έχει πολλαπλά κλειδιά ανώτατου επιπέδου (π.χ. {"a":1,"b":2}), το αποτέλεσμα τυλίγεται σε ένα στοιχείο <root>: <root><a>1</a><b>2</b></root>. Αν το JSON σας έχει ακριβώς ένα κλειδί ανώτατου επιπέδου, αυτό το κλειδί γίνεται απευθείας το όνομα του ριζικού στοιχείου.
Πώς αναπαρίστανται τα χαρακτηριστικά XML στο JSON;
Ένα χαρακτηριστικό όπως <user id="7"> γίνεται το κλειδί "@_id": "7" στο προκύπτον αντικείμενο JSON. Αυτή είναι μια κοινή, τεκμηριωμένη σύμβαση (που χρησιμοποιείται από βιβλιοθήκες όπως το fast-xml-parser) η οποία κρατά τα χαρακτηριστικά διακριτά από τα θυγατρικά στοιχεία.
Τα επαναλαμβανόμενα στοιχεία XML γίνονται πίνακας JSON;
Ναι. Αν ένα στοιχείο έχει πολλαπλά θυγατρικά με το ίδιο όνομα ετικέτας, π.χ. <items><item>1</item><item>2</item></items>, η μετατροπή σε JSON παράγει {"items":{"item":["1","2"]}}. Η μετατροπή αυτού του JSON πίσω σε XML αναπαράγει τα επαναλαμβανόμενα στοιχεία <item>.
Διατηρούνται οι αριθμοί και τα booleans κατά τη μετατροπή XML σε JSON;
Το XML δεν έχει εγγενή έννοια αριθμών ή booleans — τα πάντα είναι κείμενο — οπότε το περιεχόμενο κειμένου περνάει ως string JSON (π.χ. "30" αντί για 30). Αν χρειάζεστε αριθμητικούς τύπους, θα πρέπει να μετατρέψετε αυτά τα πεδία εκ των υστέρων.
Ανεβαίνουν τα δεδομένα μου πουθενά;
Όχι. Η ανάλυση και η μετατροπή γίνονται εξ ολοκλήρου σε JavaScript στον browser σας, χρησιμοποιώντας το ενσωματωμένο DOMParser API — τίποτα δεν αποστέλλεται σε server, οπότε είναι ασφαλές να το χρησιμοποιήσετε με ιδιωτικά αρχεία διαμόρφωσης ή εσωτερικά payload API.