Ik heb vorig jaar een middagje een Helm waarden bestand gedebugt dat een collega had gezworen dat het klopte Elke sleutel zag er goed uit De dienst weigerde te starten De dader bleek vier karakters te zijn: NO als landcode, niet geciteerd, in een lijst van regio's De YAML-parser las het als de boolean false, de weergegeven sjabloon false in een header, en het verzoek werd stroomafwaarts afgewezen met een foutmelding waarin noch YAML noch Noorwegen werd genoemd Die bug is beroemd genoeg om een naam te hebben - het probleem Noorwegen - en het is slechts een van een familie van verrassingen die wachten in een formaat dat de meesten van ons behandelen als & quot;JSON met mooiere witruimte."
tl;dr: de yaml naar json-converter parseert een YAML-document en drukt het equivalente JSON af, waarbij onderweg ankers, aliassen, samenvoegsleutels en blokscalairen worden opgelost. Als u uw configuratie als JSON ziet, ziet u precies wat de parser heeft besloten dat uw waarden betekenen - welke typen deze heeft afgeleid, welke referenties deze heeft uitgebreid - voordat die interpretatie een cluster bereikt. Het draait volledig in uw browser.
Het converteren van YAML naar JSON is niet alleen een formaatwijziging Het is de snelst beschikbare audit van wat uw configuratie daadwerkelijk bevat JSON heeft geen opmerkingen, geen ankers, geen impliciete typering buiten wat de syntaxis ronduit aangeeft, dus de JSON-weergave van een manifest is de opgeloste, ondubbelzinnige versie ervan Deze gids behandelt hoe YAML JSON in kaart brengt, het type en referentiegedrag dat echte incidenten veroorzaakt, en hoe u de converter kunt gebruiken wanneer u een configuratie debugt, scripting maakt tegen een manifest of een testopstelling schrijft.
Wat doet het converteren van YAML naar JSON eigenlijk?
De relatie is gedefinieerd, niet incidenteel: de YAML 1.2 specificatie stelt dat YAML een superset is van JSON, dus elk JSON-document is al geldig YAML. YAML en JSON beschrijven dezelfde drie dingen: mappings van sleutels aan waarden, geordende reeksen en scalairen Conversie loopt door het YAML-document en zendt elk construct uit in zijn JSON-equivalent Een blokmapping wordt een object Een blokreeks wordt een array Een scalair wordt een string, getal, boolean of null, afhankelijk van hoe het YAML-kernschema het oplost.
Het structurele gedeelte is oninteressant omdat het mechanisch is Het interessante is alles wat YAML kan uitdrukken dat JSON dat niet kan, want daar moet de converter namens jou een beslissing nemen:
| YAML-functie | Wat JSON krijgt | Waarom het ertoe doet |
|---|---|---|
Opmerkingen (# ...) |
Gedropt | JSON heeft geen commentaarsyntaxis; documentatie in uw configuratie is niet bewaard gebleven |
Ankers en aliassen (&base, *base) |
Uitgebreide exemplaren | JSON heeft geen referentiesyntaxis, dus gedeelde blokken worden gedupliceerd |
Sleutels samenvoegen (<<: *base) |
Afgeplat in het object | Expliciete sleutels overschrijven samengevoegde sleutels, volgens de samenvoegsleutelspecificatie |
| blokkades (` | , >`) |
Een enkele snaar met ontsnappingen |
Meerdere documenten (---) |
Een scala aan documenten | Een Kubernetes-bundel wordt een JSON-array, één element per bron |
| Impliciet typen | Opgeloste types | Niet geciteerd 8080 wordt een getal, true een boolean, null een nul |
Die laatste rij is degene die het waard is om naar te staren JSON dwingt elke waarde om zijn type te declareren door middel van syntaxis: citaten betekenen tekenreeks, kale cijfers betekenen getal YAML leidt type af uit de vorm van de tekst Converteren naar JSON maakt de gevolgtrekking zichtbaar Als je een versiereeks verwachtte en JSON je laat zien 1.1 waar de YAML zei 1.10, u hebt een bug gevonden die u anders zou hebben verzonden.
Waarom YAML' impliciet typen veroorzaakt echte storingen
Het kernschema van YAML 1.2 lost een niet geciteerde scalair op per patroon Cijfers worden gehele getallen Cijfers met een decimaal of exponent worden floats. true en false booleanen worden. null en ~ nul worden Al het andere is een string.
Dat klinkt netjes totdat je voldoet aan de waarden die op het ene type lijken en als een ander bedoeld zijn
- Havens en ID's.
port: 08080is niet het getal 8080 Een voorloopnul maakt het een ongeldig geheel getal onder het kernschema, dus de meeste parsers geven de string terug, en sommige oudere interpreteren het als octaal Postcodes, telefoonnummers en account-ID's met voorloopnullen hebben hetzelfde probleem. - Versies.
version: 1.10is de vlotter1.1. De achterste nul is weg, en geen enkele parser waarschuwt je Vergelijk dat met een containertag en het opzoeken mislukt. - Land - en taalcodes. Onder YAML 1.1 - dat PyYAML nog steeds standaard volgt, samen met veel Ruby en oudere Java-tooling -
y,n,yes,no,on, enoffbooleanen zijn.NO,ON, enNAzijn volkomen gewone tweeletterige codes in de echte wereld. - Tijden en sexagesimalen. YAML 1.1 parseert ook
12:30als grondtal-60, dat is 750. Cron-achtige of duurachtige strings kunnen verdwijnen in gehele getallen.
Elk van deze is een stille gegevens corruptie, geen parse fout Het document is geldig, de pijplijn is groen, en de waarde is verkeerd De converter' s Houd snaren optie bestaat voor precies deze klasse van onderzoek: schakel het in en elke gewone scalair komt terug als een string, zodat u de twee conversies naast elkaar kunt vergelijken en precies kunt zien welke waarden de parser herinterpreteerde Wat de JSON ook toont zonder die optie is wat uw productieparser vandaag de dag waarschijnlijk doet.
De oplossing in uw bron YAML is altijd hetzelfde: citeer alles waarvan de betekenis tekstueel is. port: "8080", version: "1.10", region: "NO". Citaten kosten niets en verwijder de hele categorie bug Als je YAML van JSON genereert in plaats van het te schrijven, zal de JSON naar YAML-converter past dat citeren automatisch toe voor dubbelzinnige waarden.
Hoe ankers, aliassen en samenvoegsleutels converteren
Ankers zijn YAML' s antwoord op herhaling U markeert een knooppunt met &name, en verwijs er later naar *namepiepsel
defaults: &defaults
restartPolicy: Always
terminationGracePeriodSeconds: 30
web:
<<: *defaults
replicas: 3
worker:
<<: *defaults
terminationGracePeriodSeconds: 120
JSON heeft geen manier om & quot; dezelfde waarde als daar." dus de converter breidt elke verwijzing uit tot een volledige kopie De uitvoer hierboven wordt drie objecten, elk met zijn eigen restartPolicy, en de JSON is langer dan de YAML die het heeft geproduceerd Dat is geen fout in de conversie - het is wat de YAML betekent, uitgeschreven.
De samenvoegsleutel << verdient een eigen noot omdat de voorrangsregel ervan gemakkelijk achteruit te krijgen is Sleutels die expliciet in de child mapping zijn geschreven, winnen van sleutels die door de samenvoeging zijn binnengehaald In het voorbeeld, worker eindigt met een respijtperiode van 120, niet 30, ongeacht of de samenvoeglijn boven of onder de expliciete sleutel verschijnt De converter implementeert die regel, dus de JSON toont u de effectieve configuratie na het samenvoegen - wat meestal het ding is dat u eigenlijk wilde inspecteren.
Hieruit volgen twee praktische toepassingen Ten eerste, wanneer een config zware verankering gebruikt, is converteren naar JSON de snelste manier om & quot; waar neemt deze omgeving eigenlijk een oplossing voor? & quot; zonder de implementatie uit te voeren Ten tweede, als een alias geen bijpassend anker heeft - een veelvoorkomend resultaat van het splitsen van één groot bestand in meerdere - rapporteert de converter het als een fout met het regelnummer, in plaats van in stilte een nul te produceren.
Hoe blokscalaren converteren
YAML heeft twee manieren om tekst met meerdere regels in te sluiten, en ze gedragen zich anders:
- Letterlijk (
|) houdt elke regeleinde precies zo geschreven Gebruik het voor shellscripts, PEM-certificaten, SQL, en alles wat witruimtegevoelig is. - Gevouwen (
>) sluit opeenvolgende regels aan met een enkele spatie en behandelt een lege regel als een alinea-einde Gebruik het voor proza dat u in het bronbestand wilt wikkelen maar in de waarde wilt samenvoegen.
Beiden accepteren een chomping indicator die achterliggende nieuwe lijnen regelt De standaard, genaamd clipping, houdt precies één achterliggende nieuwe lijn. Een min (|-) stript alle achterliggende nieuwe lijnen. Een plus (|+) houdt ze allemaal.
In JSON stort dit alles in één snaar samen \n ontsnapt Dat is nog een reden waarom de JSON-visie nuttig is: het is ondubbelzinnig. A | blok waarvan de laatste regel per ongeluk ingesprongen was, of een > blok dat twee lijnen die je gescheiden wilde houden, samenvoegde, is duidelijk zichtbaar in JSON en bijna onzichtbaar in YAML. De converter behandelt ook de behuizing die naïeve implementaties opvangt - a # karakter in een letterlijk blok is inhoud, geen commentaar, wat belangrijk is op het moment dat je een shellscript insluit, te beginnen met een shebang.
Hoe de YAML naar JSON Converter te gebruiken
Stap 1: Plak het document
Plak een YAML in het invoerpaneel: een Kubernetes-manifest, a docker-compose.yml, een GitHub Actions-workflow, een Ansible-speelboek, a .gitlab-ci.yml, of een applicatie config Multi-document bestanden met --- scheidingstekens zijn prima - elk document wordt onafhankelijk geparseerd Klik Load Sample om te beginnen met een realistische implementatie die geneste kaarten, reeksen, een lege verzameling en een letterlijke scalaire blokscalair oefent.
Het enige dat niet zal ontleden is inspringen met tabtekens YAML verbiedt tabbladen ronduit, en de converter zegt dat met het aanstootgevende regelnummer in plaats van te raden. Editors die een tabblad op Enter invoegen zijn de gebruikelijke bron; de meeste hebben een " converteer inspringen naar spaties" opdracht die het hele bestand in één keer repareert.
Stap 2: Kies de uitvoervorm
Pick 2 spaties, 4 spaties, of Geminifieerd. Geminifieerd is wat u wilt als u op het punt staat het resultaat in een curl lichaam of een omgevingsvariabele Ingesprongen uitvoer is wat je wilt als een mens het moet lezen.
Sorteer sleutels herschrijft de objecttoetsen op elk niveau alfabetisch Dit is van onschatbare waarde bij het vergelijken van twee versies van een config: twee bestanden die alleen in sleutelvolgorde verschillen, produceren een identiek gesorteerde JSON, dus een diff toont alleen echte veranderingen Voer beide uitgangen in de JSON-differentiatie tool en je krijgt een nauwkeurige structurele vergelijking in plaats van een regel voor regel.
Houd snaren schakelt scalaire dwang uit, zoals hierboven beschreven Gebruik het wanneer je de ruwe tekst van elke waarde wilt zien, of wanneer een downstream consument alles toch als een string behandelt.
Stap 3: Converteer en lees de fouten
klikken bekeerling. Als het document goed is opgemaakt, verschijnt de JSON hieronder samen met het aantal regels, het aantal sleutels, de bytegrootte en - voor stromen met meerdere documenten - hoeveel documenten er zijn gevonden.
Als het niet goed is gevormd, geeft de fout de naam van de regel De berichten behandelen de fouten die in de praktijk daadwerkelijk gebeuren: tabbladen die worden gebruikt voor inspringen, een regel die inconsistent is ingesprongen met zijn broers en zussen, een niet-beëindigde tekenreeks met aanhalingstekens, een alias zonder anker, een samenvoegsleutel die wijst naar iets dat geen mapping is Een regelnummer verandert een jacht van vijf minuten in een fix van vijf seconden.
Stap 4: Kopiëren, downloaden of doorgaan
Kopieer de JSON naar uw klembord of download deze als een .json bestand. Vanaf daar zijn veel voorkomende volgende stappen behoorlijk afdrukken en valideren met de JSON-formatter, typen genereren voor een configloader met json naar typoscript, of het afleiden van een contract voor CI-validatie met de JSON-schemagenerator.
Echte workflows die hierop passen
Het debuggen van een manifest dat " er prima uitziet"
Wanneer een implementatie zich onverwacht gedraagt en de YAML correct leest, converteer deze dan Negen van de tien keer toont de JSON het probleem onmiddellijk: een waarde die een Boolean werd, een geneste sleutel die één niveau ondieper was dan bedoeld vanwege een verdwaalde ruimte, een anker dat uitgroeide tot iets ouds De JSON-weergave verwijdert de dubbelzinnigheid in de witruimte die de bug onzichtbaar maakte.
Scripting tegen configuratie
Shell en Node scripts verwerken JSON native; YAML heeft een afhankelijkheid nodig Wanneer ik elke afbeelding tag uit een bundel manifesten moet trekken, eerst converteren naar JSON en doorbladeren jq is sneller dan het toevoegen van een YAML-bibliotheek aan een wegwerpscript De converter's ondersteuning voor meerdere documenten is hier van belang - een Kubernetes-bundel van zes bronnen wordt een JSON-array die u kunt itereren.
Testarmaturen bouwen
Integratietests hebben vaak een configuratieobject nodig in plaats van een configuratiebestand. Als u het echte manifest naar JSON converteert, krijgt u een armatuur die gegarandeerd overeenkomt met de productievorm, wat een veel beter startpunt is dan een object dat u vanuit uw geheugen hebt getypt. Koppel het aan json naar typoscript en je armatuur wordt geleverd met types.
Configuratie beoordelen in een pull-verzoek
Verschillen van zwaar verankerde YAML zijn moeilijk te lezen omdat een verandering van één regel naar een anker elke consument stilletjes verandert. Beide versies converteren met Sorteer sleutels ingeschakeld en diffing van de JSON toont de werkelijke straal van de explosie: elke opgeloste waarde die veranderde, niet alleen de regel die werd bewerkt.
Migreren tussen gereedschap
Tal van platforms accepteren JSON maar niet YAML, of omgekeerd Converteren is meestal de hele migratie Wanneer je de andere kant op moet - JSON in de hand, YAML vereist - de JSON naar YAML-converter sluit de lus, en de YAML-validator bevestigt de resultaatparses voordat u deze vastlegt.
YAML en JSON vergeleken
| Dimension | lijk heb- | Json |
|---|---|---|
| nadere beschouwing | ja | heel weinig |
| Menselijke bewerking | Inspringing gebaseerd, gemakkelijk te skim | Interpunctie-zwaar, breedsprakig |
| Machine ontleden | Langzamere, grotere parsers, meer randkoffers | Snel, overal kleine parsers |
| Type gevolgtrekking | Impliciet, schema-afhankelijk | Expliciet van syntaxis |
| referentiën | Ankers, aliassen, sleutels samenvoegen | niet een |
| Meerdere documenten per bestand | Ja, via --- |
heel weinig |
| Typisch thuis | Config bestanden, CI pijpleidingen, manifesten | API's, gegevensuitwisseling, opslag |
YAML 1.2 is formeel een superset van JSON, dus elk JSON-document is al geldig YAML Het omgekeerde is niet waar, daarom is het converteren van YAML naar JSON een verliesgevende bewerking in precies één richting: opmerkingen en referentiestructuur worden weggegooid, terwijl gegevens bewaard blijven Als uw YAML opmerkingen heeft waar u om geeft, bewaar dan de YAML als de bron van de waarheid en behandel de JSON als een afgeleid artefact.
Privacy: waarom dit in uw browser draait
Config-bestanden behoren tot de meest gevoelige artefacten in platte tekst die een team heeft Ze dragen interne hostnamen, clusternamen, registerpaden, serviceaccounts, database-ID's en - ondanks iedereen ' de beste bedoelingen - af en toe een inloggegevens die nog niet tot een geheime manager zijn gekomen.
De converter is client-side JavaScript Uw document wordt geparseerd in de pagina, de JSON wordt geproduceerd in de pagina, en geen verzoek draagt uw gegevens ergens Laad de tool een keer en het blijft werken met het netwerk uit, wat een redelijke gewoonte is voor alles waar u een manifest in plakt Dit is hetzelfde principe achter elke tool op de site, en de redenering wordt uiteengezet in de gids op Gegevensprivacy in online tools. Als u een browsertoolkit voor algemeen gebruik samenstelt, zal de Webontwikkelaar Toolkit gids behandelt wat er nog meer in thuishoort.
Beperkingen die het weten waard zijn
Geen enkele converter die in een browsertabblad past, implementeert elke hoek van de YAML-specificatie, en het is nuttiger om specifiek te zijn over de randen dan te impliceren dat die er niet zijn.
Complexe mapping sleutels - de expliciete ? key vorm waarbij de sleutel zelf een reeks of afbeelding is - worden niet ondersteund, omdat JSON-objecttoetsen tekenreeksen moeten zijn Typ tags zoals !!binary of aangepast !MyType richtlijnen worden niet geïnterpreteerd; de waarde komt door als tekst De speciale floatwaarden .inf, -.inf, en .nan worden bewaard als snaren, aangezien JSON geen letterlijke tekst voor hen heeft en zich in stilte bekeert tot null meer informatie zou verliezen dan het bespaart Richtlijnen zoals %YAML 1.2 worden genegeerd in plaats van dat er actie op wordt ondernomen.
Geen van deze komen voor in gewone Kubernetes, Compose, Actions, of Ansible bestanden Als je er op slaat, werk je met een document dat is geschreven voor een specifieke taal' s YAML bibliotheek, en die bibliotheek' s eigen dumper is het juiste gereedschap.
FAQ
Hoe converteer ik YAML online naar JSON online?
Plak uw YAML in het invoerpaneel en klik op Converteren. De parser leest het document, lost ankers op en blokkeert scalaire en drukt geformatteerde JSON af die u kunt kopiëren of downloaden. Alles gebeurt in uw browser, dus er wordt geen bestand geüpload.
Is JSON een subset van YAML?
Ja. YAML 1.2 werd opnieuw gedefinieerd als een strikte superset van JSON, dus elk geldig JSON-document is ook geldig YAML. Het omgekeerde is niet waar: YAML voegt opmerkingen, ankers, blokkalars, meerdere documenten per bestand en niet-stringsleutels toe, die JSON geen van alle direct kan uitdrukken.
Hoe worden YAML-ankers en aliassen geconverteerd naar JSON?
JSON heeft geen referentiesyntaxis, dus elke alias wordt uitgebreid tot een volledige kopie van de waarde die zijn anker definieert Een config die een standaardblok drie keer hergebruikt, levert drie identieke JSON-objecten op De uitvoer is dus groter dan de YAML-bron maar semantisch identiek.
Wat gebeurt er met het samenvoegen van toetsen zoals de dubbele hoekbeugel?
De toewijzing waarnaar wordt verwezen, wordt samengevoegd tot het huidige object. Sleutels die expliciet zijn geschreven in de onderliggende mapping win over samengevoegde sleutels, wat overeenkomt met het gedrag van de YAML-merge-key-specificatie en van Kubernetes en Ansible-tooling.
Waarom is mijn YAML mislukt met een tabsfout?
YAML verbiedt tabtekens voor inspringen - de specificatie staat alleen spaties toe Editors die tabbladen invoegen op Enter zijn de gebruikelijke oorzaak Converteer de leidende tabbladen naar spaties, wat de meeste editors voor een heel bestand tegelijk kunnen doen, en het document zal parseren.
Kan ik een YAML-bestand met meerdere documenten en documentscheidingstekens converteren?
Ja Elk document tussen de scheidingsmarkeringen wordt onafhankelijk geparseerd en het resultaat is een JSON-array met één element per document, in bronvolgorde Een bestand met één document retourneert het object zelf, niet een array met één element.
Zullen poortnummers en versiestrings hun type behouden?
Gewone scalairen worden opgelost door het YAML-kernschema, dus een niet-geciteerde 8080 wordt het getal 8080 en een niet-geciteerde 1.10 wordt 1.1. Citeer de waarde in uw YAML om het een tekenreeks te houden, of schakel de optie Strings behouden in om alle scalaire dwang uit te schakelen.
Hoe converteren letterlijke en gevouwen blokscalaren?
Een letterlijk blok houdt elke nieuwe regel, dus het wordt een JSON-tekenreeks met ontsnapte regeleinden Een gevouwen blok voegt opeenvolgende regels met een spatie en behandelt lege regels als alinea-einden. Er worden chomping-indicatoren gerespecteerd: een min laat de achterliggende nieuwe regel vallen en een plus houdt elke achterliggende lege regel.



