Χωρίς μεταφόρτωση, 100% τοπικά, χωρίς λογαριασμό

Άρθρο

Μετατροπή μεταξύ CSV, XML, JSON και YAML: πρακτικός οδηγός

Τα CSV, JSON, XML και YAML είναι οι τέσσερις μορφές που συναντούν πιο συχνά οι προγραμματιστές σε pipelines δεδομένων, αρχεία ρύθμισης και APIs. Η μετατροπή μεταξύ τους είναι απλή όταν τα μοντέλα δεδομένων ταιριάζουν, και εκπλήξει με τις απώλειες όταν δεν ταιριάζουν. Ο οδηγός αυτός καλύπτει τι μπορεί και τι δεν μπορεί να αναπαραστήσει κάθε μορφή, πού εξαφανίζονται πληροφορίες κατά τη μετατροπή, και τις παγίδες κωδικοποίησης που προκαλούν αθόρυβη καταστροφή δεδομένων. Το εργαλείο data-converter σε αυτόν τον ιστότοπο διαχειρίζεται τις τρεις από τις τέσσερις μορφές (CSV, JSON και YAML) εξ ολοκλήρου στον browser· οι ενότητες για το XML εδώ αποτελούν υπόβαθρο για όταν μετακινείτε δεδομένα με το χέρι ή με ξεχωριστό εργαλείο.

Οι τέσσερις μορφές και τα μοντέλα δεδομένων τους

Το CSV οργανώνει δεδομένα ως ένα επίπεδο πλέγμα γραμμών και στηλών. Η πρώτη γραμμή ονομάζει συνήθως τις στήλες· κάθε επόμενη γραμμή είναι μία εγγραφή. Δεν υπάρχει εμφώλευση, καμία πληροφορία τύπου, και κανένα πρότυπο για κάτι πέρα από απλό κείμενο στα κελιά. Κάθε τιμή είναι συμβολοσειρά, εκτός αν η εφαρμογή που την καταναλώνει επιβάλλει τύπο. Το JSON αναπαριστά δεδομένα ως δέντρο αντικειμένων (χάρτες κλειδιών-τιμών) και πινάκων. Οι τιμές μπορεί να είναι συμβολοσειρές, αριθμοί, boolean, null, εμφωλευμένα αντικείμενα ή πίνακες οποιουδήποτε βάθους. Αυτό επιτρέπει σε ένα μόνο έγγραφο JSON να αναπαριστά μια εγγραφή πελάτη με εμφωλευμένα αντικείμενα διεύθυνσης, πίνακες στοιχείων γραμμής και αριθμητικά σύνολα με τύπο. Το XML αναπαριστά δεδομένα ως δέντρο στοιχείων. Κάθε στοιχείο μπορεί να φέρει ονομαστές ιδιότητες και να περιέχει θυγατρικά στοιχεία ή περιεχόμενο κειμένου. Δεν υπάρχει ενσωματωμένος αριθμητικός τύπος ή boolean· όλα είναι κείμενο. Σχήματα όπως το XSD μπορούν να επιβάλλουν τύπους κατά την επικύρωση, αλλά η μορφή μεταφοράς είναι πάντα δεδομένα χαρακτήρων. Το YAML χρησιμοποιεί εσοχή για να εκφράσει το ίδιο μοντέλο αντικειμένων-και-πινάκων με το JSON, με πιο καθαρή συντακτική γλώσσα αναγνώσιμη από ανθρώπους. Το YAML είναι υπερσύνολο του JSON: κάθε έγκυρο έγγραφο JSON είναι επίσης έγκυρο YAML. Προσθέτει συμβολοσειρές πολλαπλών γραμμών, σχόλια και αναφορές anchor-alias για επαναλαμβανόμενα τμήματα. Το YAML είναι συνηθισμένο σε αρχεία ρύθμισης· το JSON είναι συνηθισμένο σε αποκρίσεις API.

Διάγραμμα που δείχνει τα τέσσερα μοντέλα δεδομένων δίπλα-δίπλα: CSV ως επίπεδο πλέγμα, JSON ως εμφωλευμένο δέντρο αντικειμένων με τιμές τύπου, XML ως δέντρο στοιχείων με ιδιότητες, και YAML ως δομή τμημάτων με εσοχή

Μετατροπές με απώλειες: ισοπέδωση και η αμφισημία του XML

Η πιο συνηθισμένη μετατροπή με απώλειες είναι η ισοπέδωση εμφωλευμένου JSON ή XML σε CSV. Ένα αντικείμενο JSON με εμφωλευμένο πεδίο διεύθυνσης δεν μπορεί να αντιστοιχιστεί καθαρά σε μια γραμμή CSV. Η τυπική λύση είναι ονόματα στηλών με τελεία: το customer.address.city γίνεται δική του στήλη. Αυτό λειτουργεί για ένα επίπεδο εμφώλευσης, αλλά αποτυγχάνει εντελώς όταν εμφανίζεται πίνακας. Ένας πελάτης με τρεις αριθμούς τηλεφώνου απαιτεί είτε τρεις ξεχωριστές στήλες (hard-coding του μέγιστου αριθμού), διαίρεση σε δεύτερο αρχείο CSV, ή κωδικοποίηση του πίνακα ως οριοθετημένη συμβολοσειρά μέσα σε ένα κελί. Καμία από αυτές τις επιλογές δεν επιστρέφει στο αρχικό JSON χωρίς επιπλέον μεταδεδομένα. Το XML εισάγει ξεχωριστή αμφισημία: η επιλογή μεταξύ ιδιότητας και θυγατρικού στοιχείου. Η τιμή Paris θα μπορούσε να αποθηκευτεί ως ιδιότητα (<city name="Paris">) ή ως θυγατρικό στοιχείο (<city><name>Paris</name></city>). Όταν ένας μετατροπέας διαβάζει XML και παράγει JSON, πρέπει να αποφασίσει πώς θα αντιστοιχίσει τις ιδιότητες. Συνήθεις συμβάσεις περιλαμβάνουν πρόθεμα @ στα κλειδιά ιδιοτήτων ή τοποθέτησή τους κάτω από ένα κλειδί "_attributes". Η επιλογή δεν είναι τυποποιημένη, πράγμα που σημαίνει ότι δύο μετατροπείς που διαβάζουν το ίδιο XML μπορούν να παράγουν δομικά διαφορετικό JSON. Αν σχεδιάζετε να μετακινείτε δεδομένα μεταξύ XML και JSON, ορίστε μια σύμβαση πριν ξεκινήσετε.

Παγίδες CSV: οριοθέτες, εισαγωγικά και κωδικοποίηση

Το CSV δεν έχει ένα ενιαίο επίσημο πρότυπο, μόνο το RFC 4180 ως ευρέως αναφερόμενο πλαίσιο. Ο πιο συνηθισμένος οριοθέτης είναι το κόμμα, αλλά στην πράξη εμφανίζονται και το ελληνικό ερωτηματικό (συνηθισμένο σε ευρωπαϊκές τοπικές ρυθμίσεις όπου τα κόμματα χρησιμεύουν ως δεκαδικοί διαχωριστές), τα tab (TSV) και το σύμβολο pipe. Ένα αρχείο με κατάληξη .csv μπορεί να χρησιμοποιεί οποιονδήποτε από αυτούς χωρίς να το σηματοδοτεί. Όταν η τιμή ενός πεδίου περιέχει τον ίδιο τον οριοθέτη, το RFC 4180 απαιτεί να τυλίξετε το πεδίο σε διπλά εισαγωγικά: "San Francisco, CA". Ένα διπλό εισαγωγικό μέσα σε ένα πεδίο με εισαγωγικά πρέπει να διαφύγει με διπλασιασμό: "He said ""hello""". Ένα πεδίο που περιέχει κυριολεκτικό χαρακτήρα νέας γραμμής πρέπει επίσης να τεθεί σε εισαγωγικά. Αναλυτές που παρακάμπτουν αυτό το βήμα παράγουν σφάλματα αριθμού γραμμών που είναι δύσκολο να ανιχνευτούν. Η κωδικοποίηση είναι ξεχωριστή παγίδα. Αρχεία CSV από εργαλεία Windows φέρουν συχνά ένα UTF-8 BOM (byte order mark: τα τρία bytes EF BB BF στην αρχή του αρχείου). Το BOM βοηθά το Excel να αναγνωρίσει την κωδικοποίηση, αλλά πολλοί αναλυτές γλωσσών προγραμματισμού αντιμετωπίζουν το BOM ως μέρος του ονόματος της πρώτης στήλης, παράγοντας μια στήλη με όνομα "id" αντί για "id". Αυτό σπάει κάθε κώδικα που αναζητά στήλες κατ' όνομα. Κατά την ανάγνωση αρχείου CSV προγραμματιστικά, αφαιρέστε το BOM πριν την ανάλυση, ή χρησιμοποιήστε μια βιβλιοθήκη που το χειρίζεται ρητά.

Απεικόνιση κανόνων εισαγωγικών CSV: πεδίο που περιέχει κόμμα τυλιγμένο σε διπλά εισαγωγικά, πεδίο που περιέχει διπλό εισαγωγικό με διπλό διαφυγή, και ακολουθία bytes UTF-8 BOM στην αρχή ενός αρχείου επισημασμένη σε hex view

Επιλογή μορφής: ρύθμιση, ανταλλαγή δεδομένων και υπολογιστικά φύλλα

Η επιλογή μορφής καθορίζεται συνήθως από το πλαίσιο, όχι από προτίμηση. Το JSON είναι η προεπιλογή για REST APIs και ανταλλαγή δεδομένων μεταξύ browser και διακομιστή. Είναι συμπαγές, αναλύεται εγγενώς σε κάθε γλώσσα προγραμματισμού και φέρει πληροφορίες τύπου για αριθμούς και boolean. Η αδυναμία του είναι η απουσία σχολίων, που το καθιστά ακατάλληλο για αρχεία που οι προγραμματιστές διαβάζουν και επεξεργάζονται με το χέρι. Το YAML προτιμάται για αρχεία ρύθμισης (Kubernetes manifests, ορισμοί CI pipeline, Ansible playbooks) επειδή επιτρέπει ενσωματωμένα σχόλια και είναι πιο εύκολο να διαβαστεί από το JSON με πολλά επίπεδα εσοχής. Ο κύριος κίνδυνός του είναι ότι τα σφάλματα εσοχής είναι αθόρυβα: ένα κλειδί με λάθος εσοχή μεταφέρεται σε διαφορετικό πεδίο εφαρμογής χωρίς κανένα σφάλμα ανάλυσης. Το XML παραμένει πρότυπο σε παλαιότερα εταιρικά συστήματα, υπηρεσίες SOAP web, μορφές εγγράφων (DOCX, SVG, RSS) και περιβάλλοντα που απαιτούν επικύρωση σχήματος ή αποσαφήνιση χώρου ονομάτων. Είναι λεπτομερές, αλλά η εργαλειοθήκη XPath και XSLT είναι ώριμη. Το CSV είναι η σωστή επιλογή όταν τα δεδομένα είναι πραγματικά επίπεδα και ο καταναλωτής είναι εφαρμογή υπολογιστικού φύλλου ή αναλυτής δεδομένων. Δεν είναι κατάλληλο για ρύθμιση ή ανταλλαγή δεδομένων API επειδή δεν έχει σύστημα τύπων και δεν υποστηρίζει εμφώλευση.

Τοπική μετατροπή με το data-converter

Το εργαλείο data-converter σε αυτόν τον ιστότοπο αναλύει και μετατρέπει μεταξύ CSV, JSON και YAML εξ ολοκλήρου μέσα στον browser· δεν διαβάζει ούτε γράφει XML. Κανένα δεδομένο δεν μεταδίδεται σε διακομιστή σε κανένα σημείο. Η μετατροπή εκτελείται στο τοπικό runtime JavaScript σας, και το αποτέλεσμα είναι διαθέσιμο για λήψη ή αντιγραφή χωρίς τίποτα να εγκαταλείπει τη συσκευή σας. Αυτό έχει σημασία για δεδομένα που δεν είναι δικά σας για να τα μοιραστείτε: αποκρίσεις API που περιέχουν προσωπικές πληροφορίες, αρχεία ρύθμισης με εσωτερικά ονόματα host, ή εξαγωγές CSV από εσωτερικές βάσεις δεδομένων. Η επικόλληση αυτών των δεδομένων σε έναν web-based μετατροπέα που εκτελείται σε διακομιστή σημαίνει ότι το περιεχόμενο αποστέλλεται μέσω δικτύου και επεξεργάζεται σε υλικό που δεν ελέγχετε. Με το data-converter, η καρτέλα του browser είναι το περιβάλλον επεξεργασίας. Το εργαλείο εφαρμόζει εισαγωγικά RFC 4180 όταν διαβάζει ή γράφει CSV, και περιμένει έναν επίπεδο πίνακα αντικειμένων για JSON ή YAML προς CSV: μια εμφωλευμένη τιμή αντικειμένου ή πίνακα κάτω από ένα κλειδί δεν ισοπεδώνεται αυτόματα με τελεία, οπότε ισοπεδώστε εσείς εκείνα τα πεδία πριν τη μετατροπή αν τα χρειάζεστε ως ξεχωριστές στήλες. Αν χρειάζεται να μετακινήσετε δεδομένα προς ή από XML, μετατρέψτε τα πρώτα σε JSON ή YAML με ένα ειδικό εργαλείο XML, και μετά φέρτε το αποτέλεσμα εδώ.

Εργαλεία αυτού του άρθρου

Συχνές ερωτήσεις

Μπορώ να μετατρέψω JSON σε CSV και πίσω και να πάρω το αρχικό;

Μόνο αν το JSON είναι επίπεδος πίνακας αντικειμένων χωρίς εμφωλευμένα πεδία και χωρίς πίνακες ως τιμές. Μόλις έχετε εμφωλευμένο αντικείμενο ή τιμή πίνακα, η αναπαράσταση CSV απαιτεί μια δομική απόφαση (στήλες με τελεία, πολλαπλές γραμμές ή κωδικοποιημένες συμβολοσειρές) που δεν μπορεί να αντιστραφεί αυτόματα. Αν τα δεδομένα σας έχουν εμφώλευση, τα JSON, XML ή YAML θα επιστρέψουν καθαρά· το CSV δεν θα επιστρέψει.

Γιατί το CSV μου φαίνεται λάθος στο Excel μετά την εξαγωγή από ευρωπαϊκή εφαρμογή;

Οι ευρωπαϊκές τοπικές ρυθμίσεις χρησιμοποιούν συχνά ερωτηματικό ως οριοθέτη CSV επειδή τα κόμματα προορίζονται για δεκαδική σημειογραφία. Το Excel με ευρωπαϊκές ρυθμίσεις αναμένει ερωτηματικά. Αν το αρχείο χρησιμοποιεί κόμματα, το Excel αντιμετωπίζει ολόκληρη τη γραμμή ως μία στήλη. Η λύση είναι είτε να αλλάξετε τον οριοθέτη στις ρυθμίσεις εξαγωγής, είτε να χρησιμοποιήσετε τον οδηγό Εισαγωγής Δεδομένων του Excel, που σας επιτρέπει να καθορίσετε τον οριοθέτη χειροκίνητα. Το ζήτημα με το UTF-8 BOM είναι ξεχωριστό: χωρίς BOM, το Excel μπορεί επίσης να διαβάσει λανθασμένα χαρακτήρες με τόνους ως κατεστραμμένο κείμενο.

Ποια είναι η διαφορά μεταξύ YAML και JSON στην πράξη;

Και τα δύο αναπαριστούν το ίδιο υποκείμενο μοντέλο δεδομένων: αντικείμενα, πίνακες, συμβολοσειρές, αριθμοί, boolean και null. Το YAML προσθέτει σχόλια (γραμμές που ξεκινούν με #), κυριολεκτικά συμβολοσειρών πολλαπλών γραμμών και αναφορές anchor για επαναλαμβανόμενα τμήματα. Το JSON είναι αυστηρά υποσύνολο έγκυρου YAML, αλλά οι αναλυτές JSON δεν διαβάζουν YAML. Ο πρακτικός κανόνας: χρησιμοποιήστε JSON για φορτία API και αποθήκευση δεδομένων· χρησιμοποιήστε YAML για αρχεία ρύθμισης που επεξεργάζονται άνθρωποι και που ωφελούνται από ενσωματωμένα σχόλια.