Skip to main content

TOML-zu-JSON-Konverter

TOML-Konfiguration in das JSON-Format konvertieren.

Geprüft von · Zuletzt geprüft

So verwendest du den TOML-zu-JSON-Konverter

  1. TOML einfügen in den Eingabebereich. Eine Rust-Cargo.toml, eine Python-pyproject.toml, eine Hugo-config.toml oder ein Black-/Ruff-Konfigurationsabschnitt funktionieren alle.
  2. Ausgabeformatierung wählen: 2-Leerzeichen-JSON für Lesbarkeit, 4-Leerzeichen für konservatives Tooling oder minifiziert für Wire-Format-Verwendung.
  3. "Konvertieren" drücken. Abschnitts-Header werden zu verschachtelten Objekten, Arrays von Tabellen kollabieren zu JSON-Arrays, und typisierte Werte (Ganzzahlen, Gleitkommazahlen, Datumsangaben, Boolesche Werte) werden auf ihre JSON-Äquivalente abgebildet.
  4. Das JSON kopieren in ein nachgelagertes Werkzeug, das TOML nicht nativ versteht - einen JSON-Schema-Validator, eine generische Konfigurationsbibliothek oder ein kleines Skript, das die strukturierten Daten benötigt.

Was das Werkzeug verarbeitet

TOML lässt sich sauber nach JSON abbilden, weil beide hierarchische Schlüssel-Wert-Formate sind. Der Konverter liest die Quelle Zeile für Zeile und hält einen aktuellen-Tabellen-Zeiger, der am Wurzelobjekt beginnt. Ein barer Header wie [package] erstellt oder wählt package als aktuelle Tabelle; ein Punkt-Header wie [tool.poetry] navigiert zu einem verschachtelten Objekt. Array-von-Tabellen-Header [[dependencies]] fügen ein neues leeres Objekt an das Array an diesem Schlüssel an und machen es zur aktuellen Tabelle für die folgenden Zeilen. Inline-Tabellen { name = "foo", version = "1.0" } erzeugen reguläre verschachtelte JSON-Objekte.

Skalare Typisierung entspricht der TOML-Spezifikation. Ganzzahl-Literale bewahren ihre Basis für Anzeigezwecke, kollabieren aber zu Dezimal in JSON. Gleitkommazahlen behalten die Dezimalform. Offset-DateTimes (1979-05-27T07:32:00Z) und lokale DateTimes werden zu ISO-8601-JSON-Zeichenketten, weil JSON keinen nativen Datumstyp hat. Basis-Zeichenketten ("...") interpretieren Escape-Sequenzen, Literal-Zeichenketten ('...') nicht. Mehrzeilige Basis-Zeichenketten entfernen den ersten Zeilenumbruch falls vorhanden, entsprechend den TOML-Regeln. Boolesche Werte sind die literalen Kleinbuchstaben true und false.

Praktische Situationen

  • Die Cargo.toml eines Projekts in ein Skript lesen, das Abhängigkeitsgraphen in einer anderen Sprache als Rust analysiert.
  • pyproject.toml in einen JSON-Schema-basierten Linter oder eine Veröffentlichungspipeline einspeisen, die JSON-Konfiguration erwartet.
  • Hugo- oder Zola-Site-Konfiguration in JSON für ein statisches Analyse-Werkzeug konvertieren.
  • Den [tool.black]- oder [tool.ruff]-Abschnitt extrahieren, um ihn durch einen JSON-Patch-basierten Konfigurations-Merger zu führen.
  • Eine falsch eingetippte TOML-Datei debuggen, indem man sieht, welche Struktur sie tatsächlich parst - JSON-Ausgabe macht die Form offensichtlich.
  • Eine kleine Konfiguration in eine JavaScript-Anwendung einbetten, die beim Start bereits JSON parst.

Dinge, die schiefgehen können

  • Eine Tabelle neu definieren. TOML verbietet das zweimalige Definieren derselben Tabelle. [a] gefolgt von einem späteren [a] sollte ein Parse-Fehler sein; ein permissiver Parser könnte sie zusammenführen.
  • Punkt-Schlüssel und Tabellen-Header mischen. Wenn man a.b.c = 1 und dann einen [a.b]-Header geschrieben hat, konfligieren die beiden Stile der Spezifikation nach. Einen Stil pro Abschnitt wählen.
  • DateTime ohne Zeitzone. TOML unterscheidet Offset-, lokale und nur-Datum-Werte. JSON verliert diese Unterscheidung - alle werden zu Zeichenketten. Wenn der ursprüngliche Typ rekonstruiert werden muss, die rohe Zeichenkette bewahren und sie mit einer TOML-bewussten Bibliothek nachgelagert parsen.
  • Ganzzahlen außerhalb des 64-Bit-Bereichs. TOML erlaubt 64-Bit-Ganzzahlen mit Vorzeichen. JavaScript-Zahlen sind 64-Bit-Gleitkommazahlen, sodass sehr große Ganzzahlen (über Number.MAX_SAFE_INTEGER, etwa 9 Billiarden) während des Parsens Präzision verlieren.
  • Nicht-ASCII in baren Schlüsseln. TOML erlaubt Unicode-Buchstaben in baren Schlüsseln. Einige nachgelagerte Werkzeuge erwarten nur ASCII-JSON-Schlüssel; die Toleranz des Ziels vor der Konvertierung prüfen.

Die TOML-Spezifikation in Kurze

TOML ("Tom's Obvious Minimal Language") wurde von Tom Preston-Werner, Mitbegründer von GitHub, erstellt. Version 1.0.0 wurde im Januar 2021 eingefroren und ist unter toml.io/en/v1.0.0 spezifiziert. Das Design-Ziel ist ein Konfigurationsformat, das für einen menschlichen Leser offensichtlich ist, zwischen Typen unterscheidet (anders als reine Umgebungsvariablen-Konfigurationen) und eine minimale Grammatik hat (anders als YAML). Jeder TOML-Wert ist eines von: Zeichenkette, Ganzzahl, Gleitkommazahl, Boolean, Offset-DateTime, lokale DateTime, lokales Datum, lokale Zeit, Array oder Tabelle. Tabellen sind ungeordnete Schlüssel-Wert-Paare-Sammlungen; Arrays von Tabellen ermöglichen das Ausdrücken von Listen ähnlicher Objekte. Die Konformitätstest-Suite unter BurntSushi/toml-test ist die Branchen-Referenz für Parser-Korrektheit.

Alternative Werkzeuge

Kommandozeilen-Nutzer haben tomljson (Teil von toml-cli), dasel und neuere Versionen von yq mit TOML-Unterstützung. Pythons Standardbibliothek fügte tomllib in Python 3.11 für das Lesen von TOML hinzu; tomli_w bearbeitet die andere Richtung. Rust-Projekte verwenden die toml-Kiste von Alex Crichton, die kampferprobt ist. Go hat pelletier/go-toml. Für Produktions-Konvertierungen eine dieser Bibliotheken wählen, weil sie die vollständige Konformitätstest-Suite bestehen; dieses Browser-Werkzeug deckt die häufigen 90 % von TOML ohne die Sonderfälle rund um Escapes in mehrzeiligen Literal-Zeichenketten und extreme DateTime-Präzision ab. Für eine Cargo.toml oder pyproject.toml, die man gerade inspizieren möchte, ist das Web-Werkzeug meist ausreichend.

Häufig gestellte Fragen

Welche TOML-Version unterstützt der Parser?

TOML 1.0.0, veröffentlicht im Januar 2021. Frühere 0.x-Versionen hatten leicht unterschiedliche Regeln für Schlüssel mit Punkten, wie Arrays mit gemischten Typen behandelt wurden und wie Datumsangaben dargestellt wurden. Wenn die Quelle aus einer Pre-1.0-Rust-Kiste oder einer alten Cargo-Datei stammt, funktionieren die meisten Dinge noch, aber Sonderfälle rund um Arrays mit gemischten Typen oder nicht standardisierte Datumformate werden möglicherweise nicht sauber konvertiert. Die Quelldatei aktualisieren, wenn möglich.

Wie werden Datums- und Zeitwerte in JSON dargestellt?

JSON hat keinen nativen Datumstyp, daher werden alle vier temporalen TOML-Varianten (Offset-DateTime, lokale DateTime, lokales Datum, lokale Zeit) zu ISO-8601-Zeichenketten, die ihre ursprungliche Textform bewahren. Ein lokales Datum wie <code>1979-05-27</code> wird zur JSON-Zeichenkette <code>"1979-05-27"</code>; ein Offset-DateTime wie <code>1979-05-27T07:32:00-08:00</code> behält seinen Offset. Diese können mit <code>new Date()</code> in JavaScript oder <code>datetime.fromisoformat</code> in Python erneut geparst werden.

Unterstutzt der Konverter Arrays von Tabellen?

Ja. Die <code>[[server]]</code>-Syntax erstellt ein JSON-Array, dessen Elemente die zwischen jedem Paar doppelter Klammern definierten Objekte sind. Das ist das Muster, das Cargo für <code>[[bin]]</code>-Ziele und Poetry für <code>[[tool.poetry.source]]</code>-Quellen verwendet. Jeder Doppelklammer-Header beginnt ein neues Objekt; die danach gesetzten Schlüssel befüllen es bis zum nächsten Header.

Ist die Konvertierung verlustbehaftet?

In einigen Randfällen ja. Ganzzahlwerte größer als <code>Number.MAX_SAFE_INTEGER</code> (etwa 9 Billiarden) verlieren Präzision, weil JavaScript Doubles mit doppelter Genauigkeit verwendet. Temporale Typen kollabieren zu Zeichenketten und verlieren ihren nativen Typ. Kommentare verschwinden, weil JSON keine hat. Für 99 % der echten <code>Cargo.toml</code>-, <code>pyproject.toml</code>- oder Hugo-Konfigurationen stoßen diese Grenzen nicht auf.

Verlasst mein TOML den Browser?

Nein. Der Konverter läuft in einer mit der Seite gebündelten Preact-Komponente; ein Klick auf "Konvertieren" ruft eine lokale JavaScript-Funktion auf. Es wird kein Fetch-Aufruf an einen externen Dienst gemacht, und die Eingabe wird nirgendwo protokolliert. Das ist wichtig, weil TOML-Konfigurationen häufig Zugangstokens, API-Schlüssel und SSH-Endpunkte enthalten, die man nicht an einen anonymen Dienst senden möchte.

Was passiert mit Inline-Tabellen in Arrays?

Eine Inline-Tabelle <code>{ a = 1, b = 2 }</code> in einem Array wird zu einem regularen JSON-Objekt in einem JSON-Array. Inline-Tabellen sind in TOML 1.0.0 vollständig unveränderlich - man kann ihnen nach der schließenden Klammer keine Schlüssel hinzufügen -, aber das beeinflusst die JSON-Ausgabe nicht, weil JSON zum Parse-Zeitpunkt kein Veränderlichkeits-Konzept hat.

Wie werden mehrzeilige Zeichenketten behandelt?

Mehrzeilige Basis-Zeichenketten (<code>"""..."""</code>) interpretieren Backslash-Escapes und entfernen den ersten Zeilenumbruch, wenn er unmittelbar nach den öffnenden Anführungszeichen folgt. Mehrzeilige Literal-Zeichenketten (<code>&#39;&#39;&#39;...&#39;&#39;&#39;</code>) bewahren ihre Inhalte einschließlich Backslashes. Beide enden als Standard-JSON-Zeichenketten, wobei eingebettete Zeilenumbrüche als <code>\\n</code>-Escapes dargestellt werden.

Kann ich mit demselben Werkzeug JSON zurück in TOML konvertieren?

Nicht auf dieser Seite. JSON zu TOML ist eine separate Konvertierung, weil die Struktur von TOML (Tabellen, Arrays von Tabellen, Punkt-Schlüssel) nicht eins-zu-eins aus dem einfacheren Objekt/Array-Modell von JSON abgeleitet wird. Es gibt Entscheidungen zu treffen - soll ein tief verschachteltes Objekt ein Punkt-Header oder eine Reihe verschachtelter Tabellen sein? Für diese Richtung <code>tomlkit</code> oder <code>tomli_w</code> in Python verwenden.

Was ist der Unterschied zwischen einem Punkt-Schlüssel und einem Abschnitts-Header?

Beide erzeugen verschachtelte JSON-Objekte, sehen aber in der Quelle unterschiedlich aus. <code>a.b.c = 1</code> auf der obersten Ebene ist ein Punkt-Schlüssel, der <code>{"a":{"b":{"c":1}}}</code> erstellt. Ein Abschnitts-Header <code>[a.b]</code> gefolgt von <code>c = 1</code> erzeugt dieselbe Struktur, schränkt aber nachfolgende Schlüssel auf den <code>a.b</code>-Namensraum ein. Im Konverter führen beide zum identischen JSON.

Warum sollte ich TOML statt YAML oder JSON verwenden?

TOML trifft die Mitte: eine strengere, lesbarere Grammatik als YAML (keine Einrückungs-Regeln, weniger Stolperfallen) und reichhaltigere Typen als JSON (Datumsangaben, mehrzeilige Zeichenketten). Es ist auch weniger mehrdeutig - TOML hat meist einen Weg, Dinge auszudrücken, während YAML mehrere hat. Deshalb hat das Rust-Ökosystem es für Cargo standardisiert und PEP 621 es für <code>pyproject.toml</code> übernommen. Der Kompromiss ist weniger weit verbreitete Bibliotheksunterstützung als JSON oder YAML.

Verwandte Tools

Mehr Developer Tools

ZeroUtil unterstützen