XML to JSON

Konvertieren Sie XML-Dokumente in Ihrem Browser in JSON. Behalten Sie Attribute unter @-präfigierten Schlüsseln, fassen Sie wiederholte Elemente zu Arrays zusammen und erzwingen Sie optional Zahlen, Booleans und null.

Lesen Sie XML als den Objektbaum, der es immer sein wollte. Fügen Sie ein XML-Dokument ein und erhalten Sie JSON zurück. Attribute bleiben unter @-präfigierten Schlüsseln erhalten, wiederholte Elemente werden zu Arrays zusammengefasst, und Typumwandlung ist opt-in, sodass Kennungen ihre führenden Nullen behalten.

JSON-Ausgabe

Die drei Probleme, die jeder XML-zu-JSON-Konverter lösen muss

Attribute haben keinen natürlichen Platz

XML zieht eine feste Linie zwischen Attributen und Kindelementen. <user id="7"><name>Ada</name></user> sagt etwas anderes als <user><id>7</id><name>Ada</name></user>, obwohl die meisten Anwendungen sie identisch behandeln. JSON hat keine entsprechende Unterscheidung, also muss ein Konverter Attribute entweder wegwerfen oder einen Platz für sie erfinden.

Die weithin genutzte Konvention, und die hier angewandte, präfigiert Attributschlüssel mit @ und speichert Elementtext unter #text, wenn ein Element sowohl Attribute als auch Inhalt hat. Also wird das erste Beispiel zu {"user": {"@id": "7", "name": "Ada"}}. Das Präfix ist Teil keines Standards, aber es ist verbreitet genug, dass die meiste nachgelagerte Software es erkennt, und es hält die Konvertierung umkehrbar. Attribute auszuschalten erzeugt sauberere Ausgabe, wenn Sie wissen, dass die Attribute Metadaten sind, die Sie nicht brauchen.

Ein Element oder eine Liste mit einem?

Das ist das Problem ohne richtige Antwort. In XML sehen ein Elternteil mit einem einzelnen <item>-Kind und ein Elternteil mit fünf strukturell ähnlich aus, aber sie müssen zu einem einzelnen Objekt bzw. einem Array werden — und nichts im Dokument sagt Ihnen, welches das Schema beabsichtigte. Ein Werkzeug ohne Schema muss aus dem raten, was es sieht.

Die Regel hier ist, wiederholte gleichnamige Geschwisterelemente zu einem Array zusammenzufassen und ein einzelnes Element als Einzelwert zu lassen. Das entspricht der Intuition beim Lesen, aber es bedeutet, dass Code, der die Ausgabe konsumiert, beide Formen behandeln muss, weil eine Liste, die heute zufällig einen Eintrag hat, ein Objekt statt eines Ein-Element-Arrays erzeugt. Wenn Sie den Konsumenten kontrollieren, normalisieren Sie mit etwas wie [].concat(value), bevor Sie iterieren.

Alles in XML ist eine Zeichenkette

Es gibt keine Typen in einem XML-Dokument ohne Schema. <count>42</count> und <sku>0042</sku> sind beide nur Text, und nur ein Mensch oder ein XSD weiß, dass das eine eine Zahl ist und das andere eine Kennung, die ihre Nullen behalten muss.

Deshalb ist Typumwandlung eine Checkbox und nicht der Standard. Wenn sie an ist, werden Werte nur umgewandelt, wenn das Round-Tripping exakt ist — eine numerische Zeichenkette wird nur zu einer Zahl, wenn ihre Rückformatierung den identischen Text ergibt, was 0042, +7 und 1e999 schützt. true, false und leere Elemente werden zu Booleans und null. Wenn sie aus ist, bleibt jeder Wert eine Zeichenkette, was die sicherere Wahl für Kennungen, Telefonnummern, Postleitzahlen und jede ganze Zahl über 2^53 ist, wo JavaScript-Zahlpräzision den Wert lautlos verfälschen würde.

Open-Source-Hinweis: implementiert in vanilla JavaScript ohne Fremdbibliotheken.

FAQ

Wird mein XML irgendwo hochgeladen?
Nein. Das Parsen nutzt den eingebauten DOMParser des Browsers, und das JSON wird lokal erzeugt, also verlässt das Dokument nie die Seite.
Wie werden Attribute dargestellt?
Als mit @ präfigierte Schlüssel, zusammen mit den Kindern des Elements. Hat ein Element sowohl Attribute als auch Text, wird der Text unter einem #text-Schlüssel gespeichert.
Warum ist ein einzelnes Element nicht zu einem Array geworden?
Ohne Schema deutet nichts darauf hin, ob ein Kind einen Einzelwert oder eine Liste mit einem bedeutet. Wiederholte Namen werden zu Arrays; ein einzelnes Element bleibt ein Einzelwert.
Was macht Typumwandlung?
Sie wandelt numerische, boolesche und leere Werte aus Text um. Zahlen werden nur umgewandelt, wenn das Round-Tripping exakt ist, also bleiben 0042 und +7 Zeichenketten.
Sollte ich die Umwandlung aus lassen?
Ja für Kennungen, Telefonnummern, Postleitzahlen und ganze Zahlen über 2^53, wo JavaScripts Zahlenpräzision den Wert ohne Warnung runden würde.
Warum erhalte ich einen ungültigen-XML-Fehler?
Das Dokument ist nicht wohlgeformt: nicht geschlossene oder nicht passende Tags, ein nicht escaptes & oder < oder mehr als ein Wurzelelement sind die üblichen Ursachen.