Was die Syntaxkonverter tun
JSON, YAML, XML, TOML und CSV enthalten nicht dasselbe. Auf dieser Seite wird genau angegeben, wie jede Form abgebildet wird, welche Konvertierungen verlustbehaftet sind und was das Tool nicht tun kann.
Was es umwandelt
Neun gezielte Konvertierungen: JSON zu YAML, YAML zu JSON, JSON zu XML, XML zu JSON, JSON zu TOML, TOML zu JSON, YAML zu TOML, TOML zu YAML und JSON zu CSV. Jeder läuft in Ihrem Browser-Tab; Es wird nichts hochgeladen.
Jede Konvertierung funktioniert intern auf die gleiche Weise: Das Quelldokument wird in einen gewöhnlichen JavaScript-Wert eingelesen und dieser Wert wird im Zielformat ausgegeben. YAML zu TOML ist kein Sonderfall, es handelt sich um den YAML-Reader, gefolgt vom TOML-Writer. Aus diesem Grund werden die folgenden Vorbehalte pro Format und nicht pro Paar angegeben – ein Vorbehalt bezüglich TOML-Datumszeiten gilt überall dort, wo TOML erscheint.
CSV ist bewusst schreibgeschützt. Beim Lesen von CSV muss man ein Trennzeichen, einen Anführungszeichendialekt, die Frage, ob die erste Zeile eine Überschrift ist, und einen Typ für jede Zelle erraten – vier Vermutungen, bei denen ein Konverter stillschweigend falsch liegt. Das ist eine Aufgabe für ein Werkzeug, das danach fragt.
XML: Attribute, Arrays und die von uns ausgewählten Regeln
XML verfügt über keine kanonische JSON-Zuordnung, daher mussten die Konventionen ausgewählt werden. Sie sind auf dem Bildschirm immer dann sichtbar, wenn XML eines der beiden Formate ist, und zwar diese.
Attribute werden zu Objektschlüsseln mit dem Präfix @. <user id="7"><name>Ada</name></user> wird als {"user":{"@id":"7","name":"Ada"}} gelesen. Das Präfix verhindert, dass ein Attribut und ein untergeordnetes Element gleichen Namens zu einem Schlüssel verschmelzen — <user id="7"><id>other</id></user> bewahrt beide.
Text innerhalb eines Elements, das auch Attribute oder untergeordnete Elemente hat, befindet sich unter dem Schlüssel #text. Ein Element, das nichts als Text enthält, wird auf diesen Text reduziert. Ein CDATA-Abschnitt befindet sich unter #cdata, sodass es sich bei seinem Inhalt sichtbar um Daten und nicht um Markup handelt.
Wiederholte Geschwisterelemente werden zu einem Array. Ein Elementname, der einmal erscheint, wird nicht zu einem Array – XML bietet einem Parser keine Möglichkeit, „eine Liste mit einem Element“ von „einem einzelnen Wert“ zu unterscheiden, und kein Konverter kann diese Informationen erfinden. Wenn Sie eine stabile Form benötigen, ist das ein Argument für ein Schema, nicht für einen clevereren Konverter.
Namespace-Präfixe werden wörtlich beibehalten: <ns:item> ist der Schlüssel ns:item und xmlns:ns ist das Attribut @xmlns:ns. Nichts wird aufgelöst, umgeschrieben oder entfernt, da durch das Auflösen eines Präfixes der tatsächlich im Dokument enthaltene Text verworfen wird.
Ein selbstschließendes Tag wird als leere Zeichenfolge gelesen. Die XML-Deklaration, Verarbeitungsanweisungen und Kommentare entfallen. Im umgekehrten Fall schreibt das Tool seine eigene Deklaration und niemals einen DOCTYPE.
Beim Schreiben von XML wird ein Schlüssel, der kein zulässiger XML-Elementname ist – einer mit einem Leerzeichen, einer mit einer Ziffer und einer mit den Buchstaben xml –, namentlich abgelehnt und nicht stillschweigend umgeschrieben. Ein stillschweigend umbenanntes Element erzeugt ein Dokument, das gegen nichts validiert ist.
Externe Entitäten werden abgelehnt, nicht nur deaktiviert
Ein XML-Dokument kann Entitäten in einem DOCTYPE deklarieren. Ein Parser, der sie erweitert, ist die XXE-Schwachstelle: Eine als SYSTEM „file:///etc/passwd“ deklarierte Entität liest eine lokale Datei, eine, die auf eine URL zeigt, stellt eine Anfrage, die ein Angreifer kontrolliert, und eine Kette interner Entitäten ist der Denial-of-Service „Milliarde Lacher“, der ein paar hundert Bytes in Gigabyte umwandelt.
Dieser Konverter konfiguriert keinen Parser, um bei DOCTYPEs vorsichtig zu sein. Es lehnt jedes Dokument ab, das ein solches enthält, bevor der Parser ein einzelnes Byte erhält, ohne die Möglichkeit, die Ablehnung auszuschalten. Das macht die Garantie zu einer Eigenschaft unseres Codes und nicht zu einer Standardeinstellung einer Abhängigkeit – und der Unterschied ist wichtig, da sich die Standardeinstellungen zwischen den Versionen ändern und unsere eigene Ablehnung durch Tests abgedeckt wird, die alle Standard-XXE-Nutzlasten einspeisen und bestätigen, dass nichts abgerufen und nichts erweitert wurde.
Die praktischen Kosten: Ein Dokument mit einem DOCTYPE wird hier nicht konvertiert, selbst wenn es harmlos ist. Löschen Sie den DOCTYPE, wenn der Inhalt Ihnen gehört.
TOML-Datumszeiten gibt es nirgendwo anders
TOML 1.0 hat vier Zeittypen und JSON, YAML und XML haben keine: Datum-Uhrzeit-Offset (1979-05-27T07:32:00Z), lokales Datum/Uhrzeit (1979-05-27T07:32:00, absichtlich ohne Zone), lokales Datum (1979-05-27) und Ortszeit (07:32:00).
Jeder wird genau so zum RFC-String 3339, wie er geschrieben wurde, und die Konvertierung zeigt Ihnen, mit welchen Werten er das gemacht hat und welche der vier Arten es sich jeweils handelte. Die Alternative – die Ausgabe eines einzigen UTC-Zeitpunkts für alle vier – würde eine Ortszeit in eine Zone verschieben, deren Angabe das Dokument ausdrücklich verweigert, was eher eine falsche als eine verlustbehaftete Antwort ist.
Beim Zurückkonvertieren werden Zeichenfolgen in Anführungszeichen erzeugt, keine Datums- und Uhrzeitangaben. Ein TOML-zu-JSON-zu-TOML-Roundtrip ändert daher die Typen dieser Werte. Daran führt kein Weg vorbei, ohne eine Konvention zu erfinden, die das empfangende Tool teilen müsste, und es wäre noch schlimmer, eine solche stillschweigend zu erfinden.
TOML Ganzzahlen sind vorzeichenbehaftet 64-Bit; JSON-Zahlen sind IEEE-754-Doppelte. Eine Ganzzahl nach 2^53 - 1 wird zu einer Zeichenfolge, deren Pfad in einer Warnung angegeben wird, anstatt dass ihre letzten Ziffern durch eine Rundung verloren gehen, die Sie nicht bemerken würden.
TOML hat keine Null. Ein Nullschlüssel wird in der Ausgabe weggelassen und in einer Warnung benannt. Eine Null innerhalb eines Arrays wird zu einer leeren Zeichenfolge, da durch das Entfernen dieser Null jeder spätere Index verschoben würde. Der Stamm eines TOML-Dokuments ist immer eine Tabelle, daher wird ein Array oder ein bloßer Wert im Stamm mit einem Satz, der den Grund dafür angibt, abgelehnt.
YAML: Anker, Streams und das Norwegen-Problem
YAML wird mit einem eingeschränkten Schema gelesen, das nur Zeichenfolgen, Zahlen, boolesche Werte, Nullen, Listen und Karten erzeugen kann. Tags, die beliebige Objekte konstruieren – !!js/function, !!python/object/apply, !!binary – werden abgelehnt, was der Grund dafür ist, dass die Einschränkung besteht: Ein Loader, der sie berücksichtigt, ist ein Konstruktor für beliebige Objekte, der das Gewand einer Konfigurationsdatei trägt.
Anker und Aliase werden in wiederholte Daten aufgelöst. Ein Dokument, das sich über eine Million Werte hinaus erweitert, sobald seine Aliase befolgt werden, wird abgelehnt, anstatt dass die Registerkarte eingefroren wird. Ein rekursiver Alias wird komplett abgelehnt, da hier kein anderes Format einen Zyklus ausdrücken kann.
Ein Stream mehrerer durch --- getrennter Dokumente wird zu einem Array von Dokumenten, und die Konvertierung besagt dies. Kein anderes Format in diesem Tool verfügt über einen Stream, daher ist ein Array die einzig ehrliche Zuordnung.
YAML verbietet die Wiederholung eines Zuordnungsschlüssels und jeder Parser behandelt ihn anders. Dieses Tool behält den letzten Wert – die Regel, die JSON.parse verwendet – und teilt Ihnen mit, dass er passiert ist, mit der Position der Wiederholung. Noch schlimmer wäre es, ein Dokument stillschweigend zu verwerfen. Es wäre noch schlimmer, stillschweigend einen Wert auszuwählen, ohne es zu sagen.
Das Norwegen-Problem: In YAML 1.1 werden die nicht in Anführungszeichen gesetzten Skalare y, ja, ein, nein, aus und der Ländercode NO alle in Boolesche Werte aufgelöst, wodurch aus einer Liste von Ländercodes eine Liste von wahren und falschen Werten wird. Dieses Tool liest YAML 1.2, wobei nur true und false boolesche Werte sind, sodass NO die Zeichenfolge NO bleibt. Wenn es YAML schreibt, zitiert es jede Zeichenfolge, die ein 1.1-Parser falsch lesen würde – „NO“, „yes“, „on“, „1.0“, „0755“, „2001-12-14“ – also die Ausgabe kann sicher einem Werkzeug zugeführt werden, das nicht nach 1.2 verschoben wurde. Das kostet ein paar Anführungszeichen und erkauft Korrektheit.
Zeichenfolgen, die wie Zahlen aussehen, behalten ihre Anführungszeichen aus demselben Grund: „0755“ bleibt eine Zeichenfolge und wird nicht zu 755, und „1.0“ bleibt eine Zeichenfolge und wird nicht zu 1.
Kommentare gehen in alle Richtungen verloren. JSON, CSV und die anderen können sie nirgendwo ablegen, und es gibt keine Möglichkeit zu erraten, wohin sie zurückkehren sollen.
JSON zu CSV: Reduzieren und das Apostroph, das eine Formel stoppt
Ein Array wird zu den Zeilen, ein Datensatz pro Element. Ein Objekt, dessen einzelne Eigenschaft ein Array enthält, verwendet dieses Array als Zeilen, da {"users": [ ... ]} überwiegend eine Tabelle mit einer Beschriftung ist – und die Konvertierung sagt laut, dass dies der Fall war. Jedes andere Objekt ist eine einzelne Zeile. Eine bloße Zeichenfolge, Zahl oder Null wird abgelehnt: Ein Rechteck benötigt Datensätze.
Verschachtelte Objekte und Arrays werden zu gepunkteten Spaltennamen zusammengefasst, mit einem Punkt sowohl für Objektschlüssel als auch für Array-Indizes: Adresse.Stadt, Tags.0, Tags.1. Ein Trennzeichen, eine Regel. Ein Schlüssel, der bereits einen Punkt enthält, macht seinen Spaltennamen bei einem verschachtelten Pfad mehrdeutig; Das Tool warnt, anstatt ein Fluchtschema zu erfinden, das keine Tabellenkalkulation verstehen würde.
Die Schlüssel werden in jeder Zeile in der zuerst sichtbaren Reihenfolge zusammengefasst. Eine Zeile, in der ein Feld fehlt, erhält eine leere Zelle statt einer verschobenen Spalte, und die Konvertierung gibt eine Warnung aus, dass die Zeilen unregelmäßig waren. Ein leeres Objekt oder leeres Array wird zu einer leeren Zelle unter seinem eigenen Pfad, anstatt zu verschwinden.
Anführungszeichen folgen RFC 4180: Ein Feld, das das Trennzeichen, ein doppeltes Anführungszeichen, CR oder LF enthält, wird in doppelte Anführungszeichen gesetzt und ein eingebettetes Anführungszeichen wird zweimal geschrieben. Datensätze werden durch CRLF getrennt. Felder mit führenden oder nachgestellten Leerzeichen werden ebenfalls in Anführungszeichen gesetzt, da Tabellenkalkulationen sie andernfalls stillschweigend kürzen. Unicode wird unverändert weitergegeben, und für Tabellenkalkulationen, die zum Lesen von UTF-8 eine Bytereihenfolgemarkierung benötigen, kann ein Präfix vorangestellt werden.
Formel-Injektion ist diejenige, die beißt. Eine Zelle, die mit =, +, -, @, einem Tabulator oder einem Wagenrücklauf beginnt, wird von Excel, LibreOffice Calc und Google Sheets beim Öffnen der Datei als Formel ausgeführt. =cmd|'/c calc'!A1 ist die Demonstration, die jeder zitiert; =IMPORTXML(...) ist derjenige, der das Blatt stillschweigend irgendwohin sendet. Ein Konverter, der eine solche Zeichenfolge wörtlich schreibt, hat Ihre Daten in die Codeausführung einer anderen Person umgewandelt, in einer Datei, die inert aussieht.
Einer Textzelle, die mit einem dieser Zeichen beginnt, wird also ein Apostroph vorangestellt, der in jeder großen Tabellenkalkulation als „Das ist Text“ lautet und nicht in der Zelle angezeigt wird. Zahlen werden in Ruhe gelassen: Eine Zahl -5 ist eine Zahl, keine Formel. Die Anzahl der entwichenen Zellen wird gemeldet und das Entweichen kann ausgeschaltet werden – in diesem Fall sagt das Tool deutlich, was Sie gerade ausgeschaltet haben.
CSV kann eine leere Zeichenfolge nicht von einer Null unterscheiden. Beide werden zu einer leeren Zelle und die Konvertierung zählt die Nullen, sodass Sie wissen, dass es passiert ist.
Grenzen und was passiert, wenn man sie erreicht
Jedes Format hat eine Zeichenobergrenze, die erzwungen wird, bevor ein Parser überhaupt heruntergeladen wird: 8 Millionen für JSON, 4 Millionen für XML und für eine CSV-Quelle, 2 Millionen für YAML und TOML. Darüber hinaus verweigert das Tool die Eingabe der genauen Nummer, anstatt zu einem nicht reagierenden Tab zu werden, der das, was Sie eingefügt haben, verliert. Die Ausgabe von
CSV ist zusätzlich auf 100,000 Zeilen und 2,000 Spalten begrenzt, da ein tief verschachteltes Array auf eine Spalte pro Element reduziert wird und ein paar Megabyte von JSON zu einer Tabelle werden können, die keine Tabelle öffnet.
Leere und nur Leerzeichen enthaltende Eingaben werden als leer gemeldet und nicht in Null oder ein leeres Dokument konvertiert. Ungültige Syntax wird mit einer Zeile und einer Spalte in allen vier lesbaren Formaten gemeldet.
Die Parser selbst werden nur dann heruntergeladen, wenn sie für eine Konvertierung erforderlich sind. Beim Öffnen des Toolkits zum Dekodieren eines JWT wird nichts davon abgerufen.
Was passiert mit dem, was Sie einfügen?
- Jede Konvertierung, jeder Hash, jede Dekodierung und jeder Diff wird in Ihrem Browser-Tab ausgeführt. Es werden keine Eingaben hochgeladen, protokolliert oder auf einem Server gespeichert, da nach dem Laden der Seite kein Server beteiligt ist.
- Hashes stammen von der browsereigenen Web Crypto-Implementierung und UUIDs von seinem kryptografisch sicheren Zufallsgenerator. Bei beiden handelt es sich nicht um einen Netzwerkanruf.
- Nichts, was Sie eingeben, wird in den lokalen Speicher oder in ein Cookie geschrieben. Beim Neuladen der Seite wird diese verworfen; Wenn Sie die Registerkarte schließen, wird sie verworfen.
- Siteweite Analysen laufen nur auf dem konfigurierten kanonischen Produktionshost und werden in der Datenschutzrichtlinie offengelegt; Lokale und Vorschau-Hosts lehnen dies ab. Eingefügte Werte, Token, URLs und Dateiinhalte sind von den eigenen Analyseereignissen von ToolAcre ausgeschlossen. Werbung ist in der aktuellen Konfiguration deaktiviert.
- Das heißt: Ein JWT oder ein API-Schlüssel ist ein Live-Zugangsdatensatz. Es ist eine sichere Angewohnheit, niemals etwas in eine Webseite einzufügen, die Sie nicht geschrieben haben, egal wie vertrauenswürdig die Behauptungen sind – auch diese hier.
Fragen
Warum schlägt mein XML-Dokument mit „deklariert einen DOCTYPE“ fehl?
Weil es eine Dokumenttypdeklaration enthält und dieser Konverter jede davon ablehnt, anstatt einer Parser-Einstellung zu vertrauen, um Entitäten sicher zu verarbeiten. Löschen Sie den DOCTYPE, wenn der Inhalt Ihnen gehört. Es gibt keine Möglichkeit, dies zuzulassen.
Warum wurde meine TOML-Datumszeit als Zeichenfolge in Anführungszeichen zurückgegeben?
Weil JSON, YAML und XML keinen Datumstyp haben. Die Datums- und Uhrzeitangabe wurde in den RFC-Text 3339 konvertiert, als der sie geschrieben wurde, was in jedem anderen Format eine Zeichenfolge ist. Die Rückkonvertierung erzeugt daher eine Zeichenfolge, und das Tool warnt Sie in dem Moment, in dem es passiert, und lässt Sie es nicht später herausfinden.
Warum beginnt eine meiner CSV-Zellen mit einem Apostroph?
Weil sein Text mit =, +, -, @, einem Tabulator oder einem Wagenrücklauf beginnt und eine Tabellenkalkulation eine solche Zelle als Formel ausführt, wenn die Datei geöffnet wird. Der Apostroph markiert die Zelle als Text; Es ist nicht mehr Teil des Werts, sobald die Zelle gelesen wurde. Sie können die Escape-Funktion ausschalten und das Tool sagt Ihnen, was das bedeutet.
Warum ist ein einzelnes wiederholtes XML-Element kein Array?
Weil XML keine Möglichkeit bietet, eine Liste mit einem Wert von einem einzelnen Wert zu unterscheiden. Beide sind identisch geschrieben. In beiden Richtungen zu raten wäre in der Hälfte der Fälle falsch, daher meldet das Tool, was tatsächlich vorhanden ist.
Kann ich CSV hier wieder in JSON konvertieren?
Nein. Das korrekte Lesen von CSV erfordert die Entscheidung über ein Trennzeichen, einen Anführungszeichendialekt, ob die erste Zeile eine Überschrift ist und einen Typ für jede Zelle. Ein Konverter, der alle vier errät, liegt stillschweigend falsch, was die schlimmste Art ist, falsch zu liegen. Verwenden Sie ein CSV-Tool, das fragt.
Warum wird "NO" nicht in false konvertiert?
Weil dieses Verhalten zu YAML 1.1 gehört und dieses Tool YAML 1.2 liest, wobei nur true und false boolesche Werte sind. Das 1.1-Verhalten ist der Grund dafür, dass der norwegische Ländercode ein Scherz im Konfigurationsmanagement ist. Wenn das Tool YAML schreibt, setzt es solche Zeichenfolgen in Anführungszeichen, sodass kein nachgeschalteter 1.1-Parser sie falsch lesen kann.
Einschränkungen
- CSV wird geschrieben, nie gelesen. Es gibt hier optional keine CSV-zu-JSON-Konvertierung.
- Kommentare gehen in alle Richtungen und in jedem Format verloren, in dem sie vorhanden sind.
- Ein TOML-Datum/Uhrzeit-Wert wird in jedem anderen Format zu einer Zeichenfolge, sodass ein TOML-Roundtrip diese Typen ändert. Es gibt keinen verlustfreien Weg.
- Ein XML-Dokument, das einen DOCTYPE enthält, wird komplett abgelehnt, auch harmlose Dokumente, und die Ablehnung kann nicht ausgeschaltet werden.
- Ein einzelnes wiederholtes XML-Element kann nicht von einem nicht wiederholten unterschieden werden, sodass XML zu JSON zu XML nicht immer die ursprüngliche Form zurückgibt.
- Gemischter XML-Inhalt – mit untergeordneten Elementen verschachtelter Text – verliert die Position des Texts relativ zu den untergeordneten Elementen und kann nicht umgeleitet werden.
- XML-Werte sind Zeichenfolgen, sofern die Typinferenz nicht aktiviert ist, da XML keine Typen deklariert; Bei eingeschalteter Schlussfolgerung unterliegen „0755“ und „NO“ den üblichen Fehlinterpretationen.
- TOML hat keine Null: Nullschlüssel werden aus der TOML-Ausgabe entfernt und Nullwerte in Arrays werden zu leeren Zeichenfolgen.
- Der Stamm eines TOML-Dokuments muss eine Tabelle sein, daher kann ein JSON-Array oder -Skalar überhaupt nicht in TOML konvertiert werden.
- JSON Zahlen sind IEEE-754-Doppelte. Ganzzahlen nach 2^53 werden in Zeichenfolgen konvertiert und nicht stillschweigend gerundet, wodurch sich ihr Typ ändert.
- CSV kann eine leere Zeichenfolge nicht von einer Null unterscheiden; beide werden als leere Zelle geschrieben.
- Bei der CSV-Reduzierung wird ein Punkt sowohl für Objektschlüssel als auch für Array-Indizes verwendet. Daher erzeugt ein Schlüssel, der bereits einen Punkt enthält, einen mehrdeutigen Spaltennamen, vor dem gewarnt, aber nicht maskiert wird.
- YAML-Anker und Aliase werden aufgelöst und nicht beibehalten. Die Ausgabe hat keine Anker und ein rekursiver Alias wird abgelehnt, da kein Zielformat einen Zyklus ausdrücken kann.
- Die Eingabe ist pro Format begrenzt – 8 Millionen Zeichen für JSON, 4 Millionen für XML, 2 Millionen für YAML und TOML – und übergroße Dokumente werden abgelehnt, anstatt langsam verarbeitet zu werden.
- Hier wird nichts anhand eines Schemas validiert. Ein Dokument kann sauber konvertiert werden und trotzdem seinen Zweck nicht erfüllen.