TOML vs YAML (en JSON): dezelfde config op drie manieren | We.Inc
Vergelijk TOML, YAML en JSON op dezelfde configbestanden, naast elkaar. Zie waar elk formaat verplicht is, van pyproject.toml en Cargo.toml tot compose.yaml.
TOML is een INI-achtig formaat gemaakt voor configbestanden: expliciete [table]-headers, strings tussen aanhalingstekens, echte datumtypes en geen betekenisvolle inspringing. YAML leunt op inspringing, raadt types uit kale waarden en voegt anchors en meerdere documenten toe. Voor vlakke instellingen is TOML moeilijker stuk te maken; voor diepe nesting leest YAML prettiger.
TOML, YAML en JSON in één oogopslag
TOML 1.0
YAML 1.2
JSON
Nesting
[table]- en [a.b]-headers
Inspringing
Accolades
Commentaar
Geen
Strings
Altijd tussen aanhalingstekens
Aanhalingstekens optioneel
Altijd tussen dubbele aanhalingstekens
Datums en tijden
Ingebouwde types
Niet in het core schema van 1.2
Alleen strings
Hoofdlettergevoelig
Ja
Ja
Ja
Mediatype
application/toml
application/yaml
application/json
Meestal hebt u geen keus: Python-packaging leest pyproject.toml, Rust leest Cargo.toml, en GitHub Actions en Docker Compose lezen YAML. Als u wel kiest, maakt één config in alle drie de formaten de afwegingen duidelijk. Kies hieronder een voorbeeld en vergelijk.
Kies een van de voorbeeldconfigs: app-instellingen, een package-manifest of een lijst servers.
Lees dezelfde data in TOML, YAML en JSON naast elkaar.
Let op waar TOML headers nodig heeft ([[servers]]) en waar YAML zorgvuldige inspringing vraagt.
Kopieer de versie die uw tool verwacht.
Lange lijsten met vergelijkbare records zijn waar TOML omslachtig wordt: elk item heeft zijn eigen [[name]]-header nodig.
TOML verbiedt dezelfde sleutel of tabel twee keer te definiëren, wat kopieer-en-plakfouten vangt die YAML afhankelijk van de parser kan doorlaten.
Zet versienummers in YAML tussen aanhalingstekens. TOML heeft die valkuil niet, omdat kale tekst daar nooit een geldige string is.
Houd waar mogelijk één formaat per repository aan. Gemengde formaten zijn alleen prima als elke tool zijn eigen formaat eist.
Veelgestelde vragen
Is TOML beter dan YAML?
Geen van beide wint overal. De expliciete headers en verplichte aanhalingstekens van TOML maken kleine en middelgrote configbestanden moeilijk verkeerd te lezen. YAML verwerkt diepe nesting en lange lijsten met minder ruis, ten koste van syntax die gevoelig is voor witruimte en impliciete typering.
Waarom gebruikt Python pyproject.toml?
De Python-packaginggidsen definiëren pyproject.toml met drie tabellen: [build-system] voor de build-backend, [project] voor metadata zoals naam, versie en dependencies, en [tool] voor instellingen van afzonderlijke tools zoals linters.
Kan TOML alles weergeven wat YAML kan?
Niet alles. TOML heeft geen anchors of aliassen, geen meerdere documenten per bestand en geen null, omdat elke sleutel een waarde moet krijgen. Voor configuratie maakt dat zelden uit, maar YAML-data die op die functies leunt, laat zich niet één op één omzetten.
Welke formaten accepteren Docker Compose en GitHub Actions?
Beide gebruiken YAML. GitHub Actions-workflows staan in .github/workflows met de extensie .yml of .yaml, en Compose zoekt standaard naar compose.yaml en accepteert voor oudere projecten nog docker-compose.yaml.
Ondersteunt TOML strings over meerdere regels?
Ja. Drie dubbele aanhalingstekens starten een basic string over meerdere regels die escapes toestaat, en drie enkele aanhalingstekens starten een literal string over meerdere regels die de inhoud precies houdt zoals geschreven.
Waar elk formaat verplicht is
Python-projecten beschrijven zichzelf in pyproject.toml en Rust-crates in Cargo.toml, dus TOML is de norm in die ecosystemen. Hugo accepteert ook TOML-front matter tussen +++-regels.
CI-pipelines, containeropstellingen en deploymentmanifesten leunen op YAML: GitHub Actions-workflows en Docker Compose-bestanden zijn allebei YAML, en welke extensie u kiest, is vooral een kwestie van consistentie.
Wat TOML opgeeft voor veiligheid
Het doel van TOML is volgens de eigen specificatie dat het ondubbelzinnig naar een hashtabel vertaalt. Dat betekent: niets raden. Tekst heeft aanhalingstekens nodig, booleans zijn alleen true en false, en elke tabel krijgt een naam in een header.
De prijs is herhaling in geneste data. Drie niveaus diep herhaalt een TOML-bestand het tabelpad in elke header, terwijl YAML gewoon inspringt.
Welke bestanden welk formaat gebruiken
Veelgebruikte configbestanden en het formaat dat ze eisen
Bestand
Formaat
Gelezen door
TOML
Python-buildtools en packaging
Cargo.toml
TOML
Cargo, de package manager van Rust
.github/workflows/*.yml
YAML
GitHub Actions
YAML
Docker Compose
JSON
npm en andere package managers voor Node
Markdown-front matter
YAML (TOML met +++ in Hugo)
Statische sitegenerators
TOML-syntax die het kennen waard is
Dotted keys, inline tables en datums
Dotted keys en inline tables voorkomen extra headers voor kleine groepen, en datums zijn getypeerde waarden, geen strings.
Eén config in TOML, YAML en JSON
Kies een voorbeeld. Alle drie de versies bevatten precies dezelfde data, zodat u kunt vergelijken hoe elk formaat het uitschrijft.
Voorbeeldconfig
TOML
YAML
JSON
In het voorbeeld met app-instellingen slaat TOML opens op als echte lokale tijd, terwijl de YAML- en JSON-versie het als string bewaren.