Konvertera mellan JSON och YAML

konverterar JSON till YAML (och tillbaka) med bevarad struktur och konfigurerbar indentering. Praktiskt för att migrera en konfiguration mellan .json- och .yaml-filer

Vad används den här JSON / YAML-konverteraren till?

Detta verktyg omvandlar ett YAML-dokument till JSON och vice versa, samtidigt som datastrukturen bevaras (objekt, arrayer, skalära typer). Konverteringen från JSON till YAML, eller YAML till JSON, är en vanlig operation i utveckling: man genererar en OpenAPI YAML-fil från en JSON-spec, konverterar utdata från ett REST-API till YAML för att committa det i ett konfigurationsrepo, översätter ett Kubernetes-manifest från YAML till JSON för att skicka det till kubectl --dry-run=client -o json, eller anpassar ett GitHub Actions-workflow till ett JSON-schema. Mer generellt är det bryggan mellan datautbytesvärlden (JSON) och världen för manuell konfigurationsredigering (YAML).

YAML vs JSON: direkt jämförelse

JSON och YAML adresserar närliggande behov men olika användningsfall. Tabellen nedan sammanfattar de viktigaste tekniska skillnaderna, användbart för att välja mellan de två beroende på sammanhang.

Kriterium JSON YAML
Mänsklig läsbarhet Medel (klamrar, citattecken överallt) Stark (indentering, lite interpunktion)
Verbositet Mer utförlig Mer koncis
Kommentarer Stöds inte Stöds (# commentaire)
Flera dokument i en enda fil Nej Ja, via separatorn ---
Anchors och aliases (återanvändning) Nej Ja (&anchor och *anchor)
Typsystem Strikt (string, number, bool, null, array, object) Implicit typkonvertering (yes, no, null, datum, tolkade skalärer)
Parsing-prestanda Mycket snabb, nativa parsers överallt Långsammare, mycket bredare grammatik
Användning för REST-API:er De facto-standard Ovanligt
Användning för konfiguration Ovanligt (utom package.json, tsconfig.json) De facto-standard (Kubernetes, CI/CD, Ansible)

När ska man använda JSON?

JSON tar över så snart ett program pratar med ett annat program. Dess typiska användningsfall:

  • REST- och GraphQL-API:er: payload för förfrågan och svar.
  • Datautbyte mellan mikrotjänster och meddelandeköer.
  • Nativ JavaScript-kod: JSON.parse och JSON.stringify utan beroende.
  • Lagring på klientsidan: localStorage, sessionStorage, IndexedDB.
  • AJAX-förfrågningar och fetch.
  • Binära eller strömorienterade varianter: BSON (MongoDB), JSON Lines (loggar, ML-dataset), MessagePack.
  • Konfiguration för JS / TS-verktyg: package.json, tsconfig.json, composer.json.

När ska man använda YAML?

YAML tar över så snart en människa regelbundet redigerar filen. Dess typiska användningsfall:

  • Docker Compose (docker-compose.yml) och stackprofiler.
  • Kubernetes-manifest (Deployment, Service, Ingress, Helm charts).
  • Ansible-playbooks och inventories.
  • CI/CD-pipelines: GitHub Actions, GitLab CI, CircleCI, Bitbucket Pipelines.
  • OpenAPI / Swagger- och AsyncAPI-specifikationer.
  • Annoterad applikationskonfiguration (Symfony, Spring Boot, Rails) där kommentarer är användbara.
  • Filer som ofta redigeras för hand, där koncis och läslighet är viktigare än parse-hastighet.

Vanliga fallgropar i YAML

YAML är mer tillåtande än JSON, vilket gör det till ett kraftfullt men förrädiskt format. De vanligaste fallgroparna:

  • Indentering: tabbar är förbjudna enligt specifikationen, endast mellanslag är giltiga. Att blanda dessa eller ändra antalet mellanslag i samma block bryter parsingen.
  • Automatisk typkonvertering av skalärer: yes, no, on, off, true, false, null, None, ~ parsas som booleaner eller null. Fallgropsexempel: ett postnummer 01234 utan citattecken blir heltalet 1234, och ett landsnamn NO (Norge) blir false. Sätt alltid tvetydiga strängar inom citattecken.
  • Flerradssträngar: | (block literal) behåller radbrytningar som de är, medan > (folded) ersätter radbrytningar med mellanslag. Chomping-indikatorerna - och + justerar beteendet på den sista radbrytningen.
  • YAML 1.1 vs 1.2: 1.1 (fortfarande mycket spridd, till exempel via PyYAML som standard) behandlar yes/no/on/off som booleaner, vilket 1.2 har tagit bort. Beteenden skiljer sig också för tal i bas 8.
  • Implicita datum: 2024-01-15 utan citattecken tolkas som ett datumobjekt av vissa parsers, inte som en sträng.

Sida vid sida-exempel

Samma dokument, uttryckt i JSON och sedan i YAML. Enkel konfiguration av en applikation med dess beroenden och miljö:

JSON-version

{
    "name": "cdrn-app",
    "version": "1.14.2",
    "environment": "production",
    "dependencies": {
        "php": "^8.3",
        "symfony/framework-bundle": "^7.0",
        "doctrine/orm": "^3.0"
    },
    "features": ["cache", "mailer", "queue"],
    "debug": false
}

Motsvarande YAML-version

# Configuration de l'application
name: cdrn-app
version: 1.14.2
environment: production
dependencies:
    php: '^8.3'
    symfony/framework-bundle: '^7.0'
    doctrine/orm: '^3.0'
features:
    - cache
    - mailer
    - queue
debug: false

YAML-versionen är cirka 25 % kortare i tecken, accepterar en kommentar i toppen och läses som en lista över egenskaper utan syntaktiskt brus.

Så använder du konverteraren

Steg för att konvertera dina data:

  1. Klistra in ditt källdokument (JSON eller YAML) i inmatningsfältet.
  2. Välj önskad konverteringsriktning (JSON till YAML eller YAML till JSON).
  3. Klicka på konverteringsknappen: det formaterade resultatet visas i utdataområdet.
  4. Verifiera resultatet och använd sedan kopieringsknappen för att hämta det till ditt urklipp.

Konverteringen utförs lokalt i din webbläsare eller via en dedikerad serverrutt beroende på tooling: ingen känslig data sparas.

Vanliga frågor

JSON eller YAML för mina konfigurationsfiler?

Om ekosystemet kräver ett format (Kubernetes i YAML, package.json i JSON), följ konventionen. Annars, föredra YAML för långa och annoterade konfigurationer som du redigerar för hand, och JSON för konfigurationer genererade av ett program eller konsumerade av kod. Förekomsten av användbara kommentarer är ofta det avgörande argumentet för YAML.

Hur behåller man kommentarer vid en round-trip YAML till JSON till YAML?

Det går inte. JSON stöder inte kommentarer: så fort man konverterar YAML till JSON går kommentarerna förlorade definitivt. För att bevara kommentarer vid programmatiska redigeringar, använd en parser som behåller layouten, som ruamel.yaml i Python i round-trip-läge, eller undvik helt att gå via JSON.

Varför parsas min YAML-fil korrekt lokalt men misslyckas i prod?

Vanliga orsaker: olika parserversioner (YAML 1.1 vs 1.2), tabbar införda av en editor, ociterade värden som ser ut som booleaner (NO, off) eller tal (01234), filkodning (UTF-8 BOM dåligt hanterad). Sätt alltid tvetydiga strängar inom citattecken och fixera parserversionen i ditt projekt.

Är JSON en delmängd av YAML?

Sedan YAML 1.2, ja i praktiken: varje giltigt JSON-dokument är ett giltigt YAML 1.2-dokument. Det omvända gäller inte: ett YAML-dokument som använder kommentarer, anchors, implicita datum eller flera dokument i en fil kan inte uttryckas direkt i JSON utan informationsförlust.

Vilka alternativ till JSON och YAML bör man känna till?

TOML: populärt för konfiguration (Cargo, pyproject.toml), bra kompromiss mellan läsbarhet och explicit typning. INI: mycket enkelt, men ingen standardiserad kapslad struktur. XML: utförligt, men fortfarande relevant för SOAP och vissa legacy Java-konfigurationer. HCL: används av Terraform. JSON5 och JSONC: utvidgningar av JSON som tillåter kommentarer och efterföljande kommatecken.

Hur stor är YAML jämfört med JSON?

Vid likvärdig struktur är YAML i allmänhet 15 till 30 % kortare i bytes, tack vare avsaknaden av citattecken kring nycklar och de flesta strängar och avsaknaden av klamrar. På wire (HTTP-transport) förblir minifierad JSON jämförbar, men YAML är fortfarande mer kompakt i läsbar version. För ren prestanda vid parsing är JSON flera gånger snabbare, vilket motiverar dess användning för API:er med hög trafik.

Exempelförfrågan

curl -X POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"json":"...","space_tabulation":1}'

Indatasschema

Fält Typ Obligatorisk Standard
json text
space_tabulation integer

Slutpunkter

  • GET https://cdrn.fr/api/v1/tools - listar alla tillgängliga verktyg
  • GET https://cdrn.fr/api/v1/tools/json-yaml-converter - hämtar schemat för detta verktyg
  • POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute - kör detta verktyg med en JSON-payload