Strumenti per sviluppatori · Convertitori di sintassi
Quattro modelli di dati a confronto: perché JSON, YAML, TOML e XML non mappano mai 1:1
· Sfondo
formati di dati json yaml
Ogni conversione tra questi formati comporta in qualche modo delle perdite, perché ciascuno è stato progettato attorno a un modello di dati diverso. Questo post mette a confronto i loro sistemi e strutture di tipi in modo da poter prevedere cosa manterrà una conversione e cosa perderà.
La configurazione che non andava avanti e indietro: un file convertito in tre formati e i campi che tornavano diversi
Un oggetto ordinario contenente numeri sicuri, stringhe, valori booleani, matrici e oggetti nidificati può sopravvivere ai test JSON-to-YAML-to-JSON e JSON-to-TOML-to-JSON. Aggiungi un valore null prima di TOML, un datetime da TOML, contenuti misti XML o un commento YAML e alcune modifiche ai valori o alle informazioni sull'origine.
La domanda utile non è se la conversione sia universalmente perdente. Dipende da quale classe di input e quale direzione preservano le proprietà necessarie. Gli avvertimenti e i rifiuti di ToolAcre rendono quella matrice osservabile anziché ridurre ogni paio a una promessa di marketing.
Una configurazione rappresentativa può andare avanti e indietro attraverso alcune coppie, ma non tutte le forme supportate
JSON fornisce null, booleani, numeri, stringhe, matrici e oggetti in questo parser. Non ha commenti, tipo datetime o sintassi di riferimento condiviso. JavaScript analizza i numeri come IEEE-754 raddoppia, quindi un numero intero già non quotato oltre l'intervallo di sicurezza potrebbe perdere precisione prima che un altro scrittore lo veda.
Le chiavi degli oggetti sono stringhe e l'ordinamento opzionale ne modifica la presentazione. Gli array rimangono ordinati. L'analisi rigorosa rifiuta commenti, virgole finali e token numerici non finiti, stabilendo una linea di base compatta per gli altri lettori.
Modello di valore di JSON utilizzato da questa implementazione JavaScript
ToolAcre accetta YAML tramite JSON limitato o schemi Core. Ancore e alias si risolvono, i commenti scompaiono, i flussi diventano array, le chiavi duplicate mantengono l'ultimo valore con un avviso e gli alias ricorsivi o esplosivi vengono rifiutati.
I tag personalizzati, i costruttori binari, timestamp, set e oggetti linguaggio vengono rifiutati. Core Infinity e NaN diventano nulli nei formati target con avvisi. Questo è intenzionalmente un sottoinsieme del più ampio sistema di tag di YAML, non una rivendicazione di supporto completo degli oggetti YAML.
Il modello YAML limitato ToolAcre accetta
TOML inizia con una tabella e supporta stringhe, interi con segno, numeri in virgola mobile, booleani, matrici, tabelle e quattro tipi temporali. Non ha nulla. ToolAcre converte date e ore in stringhe orientate all'origine e interi estesi in stringhe decimali anziché perdere cifre.
Quando si scrive TOML, le chiavi degli oggetti null vengono omesse e le voci dell'array null diventano stringhe vuote. Gli array root e gli scalari vengono rifiutati. I commenti e la scelta dell'autore tra intestazioni, chiavi puntate e tabelle inline non restituiscono un valore semplice.
Tabella radice, valori temporali e limite nullo di TOML
XML viene proiettato come un albero con attributi `@`, chiavi figlio ordinarie, `#text`, `#cdata`, array di fratelli ripetuti e prefissi dello spazio dei nomi letterali. Commenti, dichiarazioni e istruzioni di elaborazione vengono eliminati. La posizione del testo misto viene persa e non è possibile conoscere uno contro molti prima che appaiano le ripetizioni.
I valori vengono letti come stringhe a meno che non sia selezionata l'inferenza. Il valore null scritto da JSON diventa un elemento vuoto e non può essere distinto dalla stringa vuota al ritorno. Ogni DOCTYPE viene rifiutato e i nomi non validi interrompono la serializzazione invece di essere riscritti.
Proiezione XML di ToolAcre: elementi, attributi, testo e prefissi letterali
Nove direzioni di spedizione: JSON a YAML, XML, TOML e CSV; da YAML a JSON e TOML; da TOML a JSON e YAML; da XML a JSON. I valori ordinari a forma di JSON funzionano meglio tra JSON e YAML. TOML introduce limiti di data e null. XML richiede convenzioni di denominazione e categoria di nodo.
CSV è un valore anomalo piatto e solo output. Le matrici o gli oggetti selezionati diventano righe, i percorsi nidificati si appiattiscono in colonne tratteggiate, le fusioni nulle con testo vuoto e le stringhe simili a formule vengono neutralizzate. CSV-to-JSON, XML-to-TOML e altre coppie assenti vengono rifiutate anziché dedotte.
Matrice di compatibilità per le nove direzioni spedite, con CSV solo come output
I formati binari e i linguaggi dello schema non rientrano nell'ambito. Uno schema può ripristinare la cardinalità dell'elenco o convalidare forme aziendali, mentre le codifiche binarie introducono tipi e frame a livello di byte non rappresentati qui. Il convertitore non rivendica mai tali capacità.
Né la conversione della sintassi dimostra la validità dell'applicazione. Un messaggio di ordine YAML, XML pulito a forma di Kubernetes o un file di progetto TOML può comunque violare il contratto di destinazione. Utilizza il validatore di dominio dopo aver controllato la mappatura della sintassi.
Conclusione: scegli il modello, quindi la sintassi e come il pannello dei convertitori di sintassi ti consente di testare una conversione prima di impegnarti in essa
Scegli il modello di dati prima di sceglierne la punteggiatura. Se commenti e alias contano, un hop JSON non può preservarli. Se null è importante, l'output TOML lo modifica. Se il contenuto misto ordinato è importante, una semplice proiezione JSON non è sufficiente. Se la destinazione è una tabella, JSON nidificato richiede una convenzione di appiattimento esplicita.
Utilizza ToolAcre per testare un documento rappresentativo e leggere ogni avviso. Il risultato è la prova di una coppia concreta e di un input, non l'autorizzazione a chiamare tutte le conversioni senza perdita di dati o ogni parser supportato completo.
Costruisci il documento rappresentativo partendo dai limiti che contano per il tuo servizio: null, testo vuoto, un identificatore di grandi dimensioni, una stringa simile a una data, un record ripetuto, un commento o un alias se è coinvolto YAML e testo misto se è coinvolto XML. Confronta i valori normalizzati dopo ogni hop supportato e conserva gli avvisi con il risultato. Quella matrice diventa un artefatto decisionale per il modello scelto piuttosto che una vaga preferenza per una sintassi familiare.