Strumenti per sviluppatori · Convertitori di sintassi
Conversione da JSON a XML: elementi root, array e nomi di tag non validi
· Come funziona
json xml formati di dati
JSON può essere un semplice array con chiavi che iniziano con cifre o contengono spazi, nessuno dei quali XML lo consente. Questo post spiega le decisioni che un convertitore deve prendere su root, array e nomi, in modo da poter prevedere l'output.
L'array senza nome: un array JSON di livello superiore che deve diventare un documento XML con radice singola e l'elemento wrapper che appare
JSON può iniziare con `[1,2]`; XML non può iniziare con due elementi di documento peer. ToolAcre pertanto racchiude un array root nel nome root selezionato e scrive ciascun membro come un figlio `<item>` ripetuto. L'avviso nomina questa convenzione, perché i nomi del wrapper e dell'elemento non erano presenti nell'origine.
Scegliendo `numbers` si ottiene un elemento documento `<numbers>` contenente due elementi elemento. La conversione è deterministica, ma non canonica: un altro sistema potrebbe richiedere `<number>` o una raccolta contenente attributi. Imposta deliberatamente la radice e confronta il risultato con il contratto XML richiesto dal ricevitore.
XML ha bisogno esattamente di una radice: perché ogni conversione inventa o richiede un nome di elemento radice
Un documento XML deve avere esattamente un elemento radice. Un oggetto JSON con esattamente una chiave ordinaria di livello superiore può utilizzare direttamente quella chiave. Un oggetto a più chiavi, array, scalare o null non ha un unico nome fornito, quindi lo scrittore lo racchiude in `root` a meno che l'utente non fornisca un altro nome legale.
La regola wrapper viene implementata prima della serializzazione e viene visualizzata come avviso. Non viene scoperto da uno schema e non afferma che `<root>` abbia significato per il servizio legacy. Dare un nome alla busta fa parte della progettazione dell'integrazione, mentre il convertitore garantisce solo una struttura ben formata nell'ambito della propria mappatura.
Gli array non hanno un equivalente XML: ripetizione di un elemento per elemento e come vengono rappresentati gli array di scalari e gli array di array
Gli array diventano elementi ripetuti. Nella radice del documento, i membri utilizzano `<item>` sotto il wrapper. All'interno di un oggetto, un array archiviato in `line` diventa fratelli `<line>` ripetuti. Le matrici di oggetti creano elementi ripetuti con campi figli; gli array nidificati non hanno nomi di dominio ed ereditano la struttura generica prodotta dal builder.
Ciò perde la distinzione tra un membro dell'array e uno scalare con lo stesso nome di elemento dopo una successiva lettura XML-to-JSON. XML fornisce occorrenze, non un indicatore di array indipendente. Se la cardinalità stabile è importante, uno schema o una mappatura dell'applicazione deve fornirla; un serializzatore generico non può dimostrarlo solo dai nomi degli elementi a forma di JSON.
Chiavi che non possono essere nomi di elementi: nomi che iniziano con una cifra, contengono spazi o segni di punteggiatura o iniziano con "xml" e come i convertitori le rinominano o le eseguono l'escape
Lo schema suggerito dai convertitori potrebbe rinominare o sfuggire a chiavi illegali. ToolAcre li rifiuta esplicitamente. Una chiave con uno spazio, una che inizia con una cifra o un trattino oppure una che inizia con le lettere riservate `xml` attiva `UNSUPPORTED_SHAPE` e denomina il percorso offensivo. La ridenominazione silenziosa produrrebbe XML che non corrisponde allo schema concordato.
I nomi validi possono iniziare con una lettera, un carattere di sottolineatura o un prefisso in stile namespace e possono contenere cifre, punti, caratteri di sottolineatura, due punti e trattini dopo l'inizio. Le chiavi di attributo utilizzano `@` solo come convenzione JSON; il restante nome dell'attributo deve superare lo stesso controllo. Rinominare intenzionalmente la chiave sorgente o scegliere un altro formato di destinazione.
Le chiavi che non possono essere nomi di elementi vengono rifiutate, mai rinominate o sottoposte a escape
Numeri e valori booleani vengono serializzati come testo di elemento, quindi il loro tipo JSON non è più dichiarato da XML. Il lettore inverso predefinito restituisce di conseguenza stringhe. Null non ha alcuna rappresentazione XML qui: diventa un elemento vuoto, indistinguibile da una stringa vuota, e lo scrittore segnala quanti valori hanno subito quella modifica.
Ciò significa che `{ "a": null, "b": "" }` può produrre due elementi vuoti che vengono letti allo stesso modo. Chiamare quel viaggio di andata e ritorno senza perdite sarebbe falso. Gli attributi `#text` e `#cdata` preservano la convenzione strutturale del convertitore, ma non aggiungono un sistema di tipo generale XML.
I tipi diventano XML testo, mentre null diventa un'ambiguità ammessa per gli elementi vuoti
Utilizza `{"order":{"@id":"A-7","customer":"Ada","line":[{"sku":"P1","qty":2},{"sku":"P2","qty":1}],"note":null}}`. La singola chiave `order` diventa la radice, `@id` diventa un attributo, ogni oggetto riga diventa un `<line>` ripetuto e null diventa un `<note></note>` vuoto con un avviso.
Rileggi l'output con l'inferenza disabilitata. L'ID dell'attributo, la quantità e i valori di testo sono stringhe e la riga è un array perché appare due volte. Ciò dimostra l'esatto inverso supportato esponendo i tipi null e numerici persi. Uno schema dell'ordine di ricezione può richiedere altri nomi o ordinamenti, che questo esempio non convalida.
Cosa non copre: produrre XML che corrisponde a un dato XSD o spazio dei nomi, che necessita di una mappatura scritta a mano
Lo scrittore non utilizza un XSD, non assegna URI dello spazio dei nomi né decide l'ordine degli elementi da uno schema aziendale. Scrive una dichiarazione XML e non emette mai una DOCTYPE. Le chiavi contenenti i prefissi dello spazio dei nomi vengono preservate letteralmente, ma questa non è una risoluzione dello spazio dei nomi o una prova che il prefisso sia dichiarato correttamente.
La generazione di XML accettata da un servizio specifico può richiedere attributi, vincoli di sequenza, gruppi di scelta e nomi qualificati. Utilizza lo schema o la documentazione corrente per creare tale mappatura. Una conversione generica è adatta per l'ispezione e per semplici documenti incentrati sui dati, non sostituisce la serializzazione basata sul contratto.
Conclusione: prevedere la forma prima di dipendere da essa e come il pannello dei convertitori di sintassi mostra la struttura XML prodotta da un documento JSON
Prevedere la busta, i nomi degli elementi e la perdita del tipo prima di dipendere dal risultato. ToolAcre racchiude i valori privi di una radice, ripete gli array, mappa le chiavi `@` sugli attributi, sostituisce null con testo vuoto e rifiuta nomi illegali anziché indovinare le sostituzioni. Ogni modifica non evidente viene visualizzata nell'output o negli avvisi.
Testa l'oggetto più piccolo che include un array di primo livello, record ripetuti, null, testo numerico e una chiave scomoda. Un rifiuto è una prova utile della necessità di una mappatura manuale. Un file riuscito necessita ancora di convalida da parte del destinatario effettivo, perché XML ben formato e XML valido per lo schema sono affermazioni diverse.
Dopo che il ricevitore ha accettato un campione, aggiungere un'ispezione inversa solo dove si prevede che la mappatura sopravviva. Gli attributi e i figli ripetuti possono andare avanti e indietro secondo la convenzione di ToolAcre, mentre i tipi null e scalari no. Registrare questa distinzione impedisce che un esempio di percorso felice di successo venga generalizzato a ogni documento d'ordine che la tua integrazione potrebbe produrre.