JSON versus YAML: welk configuratieformaat moet u gebruiken?
Snel antwoord
Gebruik JSON voor API's, data-uitwisseling en gevallen waar strikte parsing&validatie telt. Gebruik YAML voor configuratiebestanden, DevOps-manifesten en gevallen waar menselijke leesbaarheid en comments belangrijk zijn. YAML is een JSON-superset —elke geldige JSON is geldige YAML.
Invoering
JSON en YAML zijn beide mens-leesbare data-serialisatieformaten. JSON is strikt, minimaal en alomtegenwoordig in web-API's. YAML is een superset van JSON die comments, multiline strings, anchors en inspringing-gebaseerde structuur toevoegt —wat het populair maakt voor configuratiebestanden (Docker Compose, Kubernetes, CI/CD pipelines).
Stap voor stap
-
Vergelijk syntaxis en leesbaarheid
JSON gebruikt accolades en aanhalingstekens: {"key": "value"}. YAML gebruikt inspringing en dubbele punten: sleutel: waarde. YAML is overzichtelijker qua configuratie: er zijn geen aanhalingstekens nodig voor tekenreeksen, geen komma's tussen items, geen accolades. JSON is explicieter en minder foutgevoelig voor gegevensuitwisseling.
-
Vergelijk functies
YAML ondersteunt: opmerkingen (#), tekenreeksen met meerdere regels (|, >), ankers (&) en aliassen (*), meerdere documenten in één bestand (---) en complexe typen. JSON ondersteunt geen van deze - geen commentaar, geen strings met meerdere regels, geen referenties. De eenvoud van JSON is opzettelijk: het is een formaat voor gegevensuitwisseling, geen configuratietaal.
-
Vergelijk veiligheid en paring
JSON parseren is snel en veilig — JSON.parse is in elke JavaScript-engine ingebouwd. Het parseren van YAML is langzamer en complexer: de YAML-specificatie is meer dan 80 pagina's versus de 2 pagina's van JSON. YAML kent beveiligingsrisico's (miljard gelachaanvallen via ankers) die JSON niet kent. Gebruik altijd een veilige YAML-parser die ankers uitschakelt.
-
Vergelijk het gebruik van ecosystemen
JSON: REST APIs, package.json, tsconfig.json, NoSQL-databases, webapps. YAML: Docker Compose, Kubernetes-manifesten, GitHub-acties, Ansible-playbooks, CI/CD-configuraties, OpenAPI-specificaties. JSON domineert runtimegegevens; YAML domineert de configuratie.
-
Beslis op basis van uw gebruiksscenario
APIs, gegevensuitwisseling, NoSQL, status van de webapp: JSON. Configuratiebestanden, DevOps, CI/CD, infrastructuur-as-code: YAML. Als mensen het met de hand schrijven: YAML. Als machines het genereren en consumeren: JSON.
Voorbeelden
Dezelfde configuratie in JSON en YAML
Invoer: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
Uitvoer: YAML is 30% korter en ondersteunt opmerkingen. JSON is strenger en universeel parseerbaar.
Veelvoorkomende problemen
- YAML-inspringfouten: YAML gebruikt inspringing voor structuur, en een enkele verkeerde spatie verbreekt het parseren. Gebruik een editor met YAML-linting en gebruik altijd spaties, nooit tabs.
- YAML miljardenlachaanval: YAML-ankers en aliassen kunnen exponentiële expansie creëren, waardoor DoS ontstaat. Gebruik een veilige YAML-parser die ankers uitschakelt (bijvoorbeeld yaml.safe_load in Python).
- JSON heeft geen commentaar: de JSON-specificatie verbiedt commentaar, waardoor configuratiebestanden moeilijker te annoteren zijn. Gebruik YAML voor door mensen bewerkte configuraties, JSON voor door machines gegenereerde gegevens.
- YAML impliciete typverrassingen: YAML converteert ja/nee automatisch naar booleans en 1.0 naar float, waardoor tekenreeksvelden kunnen worden verbroken - tekenreeksen expliciet worden geciteerd om onverwachte typedwang te voorkomen.
Tips
- Gebruik YAML voor door mensen geschreven configuraties (Docker Compose, Kubernetes, CI/CD) en JSON voor door machines gegenereerde gegevensuitwisseling (APIs, NoSQL, app-status).
- Gebruik altijd een veilige YAML-parser die ankers en aliassen uitschakelt. Gebruik nooit een algemene YAML-lader voor niet-vertrouwde invoer.
- Wanneer u YAML naar JSON converteert, kunt u er rekening mee houden dat er opmerkingen, tekenreeksen met meerdere regels en ankers verloren gaan. JSON is een subset van YAML, en niet andersom voor functies.
- YAML consistent met twee spaties laten inspringen: het combineren van tabs en spaties of het gebruik van inconsistente inspringing is de meest voorkomende YAML-parseerfout.