मुफ्त YAML से JSON कन्वर्टर
YAML को तुरंत JSON में कन्वर्ट करें। सूचियों, मैप और एंकर समेत सभी YAML सिंटैक्स को संभालता है। पूरी तरह से आपके ब्राउज़र में चलता है।
YAML क्या है?
YAML (YAML ऐन्ट मार्कअप लैंग्वेज) एक मानव-अनुकूल डेटा सीरियलाइजेशन फॉर्मेट है जिसका उपयोग आमतौर पर कॉन्फिगरेशन फाइलों के लिए किया जाता है। इंडेंटेशन और सरल सिंटैक्स का उपयोग करके सूचियों, डिक्शनरी और स्केलर मानों जैसी डेटा संरचनाओं का प्रतिनिधित्व करता है।
YAML को JSON में क्यों कन्वर्ट करें?
- सार्वभौमिक संगतता · JSON लगभग सभी प्रोग्रामिंग भाषाओं और टूल्स द्वारा समर्थित है।
- कॉन्फिगरेशन प्रबंधन · कई टूल कॉन्फिगरेशन या डेटा विनिमय के लिए JSON की अपेक्षा करते हैं।
- API एकीकरण · वेब API आमतौर पर JSON फॉर्मेट की आवश्यकता रखते हैं।
- डेटा प्रसंस्करण · स्वचालित वर्कफ़्लो में उपयोग के लिए YAML कॉन्फिग फाइलों को कन्वर्ट करें।
अक्सर पूछे जाने वाले प्रश्न
कौन सी YAML सुविधाएँ समर्थित हैं?
कन्वर्टर मैप, सूचियाँ, स्ट्रिंग, संख्याएँ, बूलियन, नल, मल्टीलाइन स्ट्रिंग, एंकर और उपनाम समेत सभी मानक YAML सुविधाओं का समर्थन करता है।
क्या मेरी जटिल YAML संरचना सही ढंग से कन्वर्ट होगी?
हाँ। कन्वर्टर नेस्टेड संरचनाएँ, ऑब्जेक्ट्स की सूचियाँ, टिप्पणियाँ (जो हटा दी जाती हैं) और सभी YAML सिंटैक्स संभालता है। यदि सिंटैक्स त्रुटि है, तो आपको स्पष्ट त्रुटि संदेश मिलेगा।
क्या YAML टिप्पणियाँ संरक्षित रहती हैं?
नहीं। टिप्पणियाँ डेटा संरचना का हिस्सा नहीं हैं, इसलिए वे JSON आउटपुट में शामिल नहीं होतीं।
YAML का एक संक्षिप्त इतिहास, 2001 का mailing-list spin-off
YAML की prehistory sml-dev mailing list से शुरू होती है, जो xml-dev से निकला एक 2000s का offshoot था जिसने ऐसे लोगों को एकत्र किया जो सोचते थे कि XML human-edited data के लिए overkill है। दो parallel tracks converge हुए: Inline Perl module के लिए serialization format के रूप में लिखा गया Ingy döt Net का Perl module Data::Denter, और Oren Ben-Kiki और Clark Evans का joint work जो XML को simplify करने पर aimed था। 11 मई 2001 को, Clark Evans ने sml-dev पर «YAML Draft 0.1» post किया, और format को अगले दिन एक xmlhack article में पहली बार publicize किया गया।
acronym का initial expansion tongue-in-cheek था: Yet Another Markup Language, 2001 में markup formats की proliferation पर एक jab। दिसंबर 2001 और अप्रैल 2002 के बीच authors ने recursive backronym YAML Ain't Markup Language को retrofit किया: आंशिक रूप से यह underline करने के लिए कि YAML XML या HTML जैसे document-markup format के बजाय एक data-serialization format है, और आंशिक रूप से इसलिए कि joke पुरानी हो गई थी। recursive expansion आज भी yaml.org पर official tagline है।
विनिर्देश समयरेखा
- Draft 0.1: 11 मई 2001, sml-dev mailing list announcement।
- YAML 1.0: 29 जनवरी 2004, Ben-Kiki, Evans, और Ingy döt Net द्वारा पहला stable spec।
- YAML 1.1: 18 जनवरी 2005, वह version जिसे अधिकांश «legacy» parsers default रूप से अभी भी emulate करते हैं। Norway Problem और अधिकांश implicit-typing warts का source।
- YAML 1.2.0: 21 जुलाई 2009, explicit «JSON superset» goal वाला पहला revision। JSON के tokens के साथ align करने के लिए Implicit typing rewritten।
- YAML 1.2.1: 1 अक्टूबर 2009, 1.2.0 का एक errata-only refresh।
- YAML 1.2.2: 1 अक्टूबर 2021, 2020 में गठित नई YAML Language Development Team द्वारा corrigenda revision।
1.2.2 spec स्पष्ट है कि «there are no normative changes from the YAML specification v1.2»; काम में source को DocBook से Markdown में convert करना, plain-text LaTeX से diagrams regenerate करना, और development process को open करना शामिल था ताकि external contributors spec के विरुद्ध pull requests file कर सकें। 2009 के बाद से कोई language नहीं आई: तब से हर parser-conformance bug या तो 1.1 holdover है या उस spec से deviation है जो अब पंद्रह से अधिक वर्षों से बरकरार है। official MIME type application/yaml 2024 में finalised हुआ; file extensions .yaml और .yml दोनों 2006 से recognized हैं, .yaml recommended है।
JSON relationship, «almost a superset»
YAML 1.2.2 spec इसे carefully कहता है: «By sheer coincidence, JSON was almost a complete subset of YAML.» JSON, YAML 1.0 (2004) और YAML 1.1 (2005) के बीच appear हुआ; YAML authors ने overlap को retroactively discover किया। 1.2 revision का explicit goal, इसके अपने words में, था «making YAML a strict superset of JSON», और यह JSON-formatted YAML 1.2 documents के लिए almost true है लेकिन YAML 1.1 के लिए not true है।
practical terms में: हर JSON document valid YAML 1.2 है, flow-style mapping {"a": 1, "b": [true, null]} दोनों में identically parse होता है। अधिकांश JSON documents YAML 1.1 में valid नहीं हैं boolean और Norway gotchas के कारण: literal string "NO" वाला JSON document 1.1 parser द्वारा default settings से round-tripped होने पर false के रूप में re-emitted होगा। reverse कभी true नहीं है: YAML ऐसी चीज़ें express कर सकता है जो JSON नहीं कर सकता, comments (conversion पर lost), anchors और aliases (conversion पर resolved), tags (typically discarded), multi-document streams (केवल first या all-as-array survive), और mappings पर non-string keys।
Norway Problem
YAML का सबसे अधिक cited gotcha। इसका नाम Norway के नाम पर है क्योंकि Norway का ISO 3166-1 two-letter country code NO है, और YAML 1.1 का boolean regex NO को boolean false के रूप में match करता है। YAML 1.1 में (या किसी भी 1.2 parser में जो अभी भी 1.1 behaviour पर default है, जो उनमें से अधिकांश हैं) country: NO लिखें, parse करें, JSON के रूप में dump करें, और आपको {"country": false} मिलता है। bug silent है, कोई warning नहीं, कोई type error नहीं, बस data corruption।
official yaml.org/type/bool.html schema से full YAML 1.1 boolean regex है:
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
यह छह lexemes (y/n, yes/no, on/off, true/false) तीन case variants प्रत्येक के साथ हैं, बाईस strings जो सभी बिना warning के booleans बन जाती हैं। valid responses की एक list [y, n, maybe], [true, false, "maybe"] बन जाती है; एक feature flag dark_mode: on, dark_mode: true के रूप में parse होता है; एक port-mode setting OFF, false बन जाती है। YAML 1.2 ने spec level पर इसे fix किया: JSON-aligned core schema केवल true, True, TRUE, false, False, FALSE को recognize करता है और y/n/yes/no/on/off को बिल्कुल recognize नहीं करता। लेकिन यह fix field तक नहीं पहुँची, PyYAML और LibYAML सभी currently shipping versions में अभी भी 1.1-default हैं। यह converter js-yaml v4 use करता है, जो YAML 1.2 / JSON-compatible schema पर default है; यही एक reason है कि browser-side converter वास्तव में PyYAML में yaml.load() run करने और वहाँ से convert करने से safer है।
अन्य implicit-typing landmines
Octal numbers। YAML 1.1 C convention follow करता था: leading zero का अर्थ octal था। इसलिए 010 integer 8 के रूप में parse होता था, और permissions: 0777 (Unix file mode लिखने का एक perfectly natural तरीका) 511 के रूप में parse होता था। YAML 1.2 का fix modern Python से matching explicit 0o prefix की आवश्यकता करना था, 0o777 511 है, और 0777 बस 777 है। 1.1 defaults पर stuck parsers अभी भी इसे गलत करते हैं।
Sexagesimal numbers। YAML 1.1 ने earlier serialization formats से convention inherit की कि colons द्वारा separated decimal digit groups के किसी भी sequence को base-60 (sexagesimal) integer या float के रूप में parse किया जाना चाहिए। advertised use case time durations था: 1:11:00 integer 4260 (एक घंटा, ग्यारह मिनट seconds में) के रूप में parse होता। यह rule practice में अभी भी लोगों को तब परेशान करती है जब वे 21:00 जैसे timestamps या 2:3:4 जैसे version numbers लिखते हैं और उन्हें silently integers में coerce पाते हैं। Sexagesimal को YAML 1.2 में silently remove किया गया, लेकिन PyYAML और अन्य 1.1-default parsers अभी भी इसे apply करते हैं।
Datetime auto-coercion। YAML 1.1 ISO 8601 timestamps को भी auto-detect करता है और उन्हें host language के native date/time type के रूप में parse करता है, जो एक problem है अगर आप string चाहते थे। version: 2024-01-15 लिखें और आपको Python date object मिलता है, string "2024-01-15" नहीं। Ruud van Asseldonk के «YAML document from hell» essay द्वारा hammered home यह general lesson: हमेशा उन strings को quote करें जो conceivably किसी और चीज़ के रूप में parse हो सकती हैं। Country codes, version numbers, file modes, timestamps, और fixed vocabulary से drawn कोई भी value को single या double quotes में wrap करना चाहिए।
Anchors, aliases, और merge key
YAML का anchor/alias system आपको किसी node को &name से label करने और बाद में *name के साथ reuse करने देता है। classic example:
defaults: &defaults timeout: 30 retries: 3 production: <<: *defaults host: prod.example.com
यहाँ &defaults mapping को anchor करता है, और <<: *defaults (merge key, जो अधिकांश parsers द्वारा retained एक 1.1 schema feature है) इसे production block में splice करता है। जब यह JSON में convert होता है, alias fully resolved हो जाता है, JSON output में literal repeated content होती है, reference नहीं। Anchors और aliases गायब हो जाते हैं, और कोई भी merge keys flatten हो जाती हैं।
इस system का प्रसिद्ध failure mode billion laughs attack है: क्योंकि anchors को multiple times alias किया जा सकता है और alias targets खुद anchors contain कर सकते हैं, एक छोटी YAML file एक enormous in-memory structure तक expand हो सकती है (10 levels × 10-fold nesting = 10¹⁰ string elements)। PyYAML, LibYAML, और अन्य को इसे mitigate करने के लिए expansion limits जोड़नी पड़ीं। Browser-side converters के natural memory caps हैं (tab host के suffer करने से बहुत पहले OOM हो जाएगा), लेकिन structural risk real है।
Multi-document streams और front matter
एक YAML stream में एक से अधिक documents हो सकते हैं। Documents को --- वाली एक line से separate किया जाता है (पहले document की शुरुआत में एक directives-end marker के रूप में भी use किया जाता है, यही कारण है कि Jekyll, Hugo, और Eleventy में front matter --- lines से bracketed है)। ... वाली एक line एक document के end को mark करती है बिना नया शुरू किए, streaming protocols में useful।
Kubernetes एक file में multiple resource manifests bundle करने के लिए --- use करता है। JSON का कोई equivalent नहीं है। एक converter के पास multi-document YAML hit करने पर तीन choices होती हैं: केवल first document emit करें, documents का JSON array emit करें, या --- से separated प्रत्येक JSON document को newlines द्वारा separated emit करें (JSON Lines)। अधिकांश converters first या second option पर default हैं; js-yaml का loadAll एक array return करता है।
Multi-line strings, folded बनाम literal
YAML के दो block-scalar styles हैं। literal style (|) newlines को exactly preserve करती है। folded style (>) single line breaks को spaces से replace करती और blank lines को paragraph separators के रूप में preserve करती है। दोनों chomping indicators accept करती हैं: |- और >- सभी trailing newlines strip करती हैं, |+ और >+ उन्हें सभी keep करती हैं, और unmodified | या > («clip») एक single trailing newline preserve करती है। JSON में convert होने पर, दोनों styles ordinary string values produce करती हैं, folded block केवल preserved blank lines पर embedded \n के साथ एक long string बन जाती है; literal block में हर line break पर \n होता है।
conversion में क्या खो जाता है
- Null representations collapse। YAML
null,Null,NULL,~, और एक empty value (key:के बाद कुछ नहीं) को null के रूप में accept करता है। पाँचों JSONnullबन जाते हैं, indistinguishably। - Comments silently vanish हो जाते हैं। YAML comments
#से शुरू होते हैं और 1.2 spec स्पष्ट है कि ये presentation-only हैं, data model का हिस्सा नहीं। JSON का कोई comment syntax नहीं है। अगर आपको उन्हें preserve करना है, तो conversion से पहले उन्हें data के रूप में store करें (जैसे, एक_commentfield)। - Non-string keys coerce हो जाती हैं। YAML mappings किसी भी node को key के रूप में allow करती हैं, integers (
1: foo), booleans (true: yes), और यहाँ तक कि nested sequences सहित। JSON को string keys की आवश्यकता है। अधिकांश converters stringify करते हैं ("1": "foo"); कुछ throw करते हैं। - Tags typically drop हो जाते हैं।
!!set,!!omap, या application-specific!myapp/Typeजैसे custom tags का कोई JSON equivalent नहीं है। - Datetimes strings के रूप में round-trip होते हैं। एक YAML date या timestamp आमतौर पर JSON में ISO 8601 string बन जाता है, क्योंकि JSON में कोई native date type नहीं है।
- Big integers JavaScript में precision खो देते हैं। JSON numbers JS में IEEE 754 doubles हैं, इसलिए
9007199254740993जैसा YAML integer conversion के बाद silently9007199254740992बन जाता है। - Anchors expand हो जाते हैं। एक YAML graph जो एक sub-tree को multiple positions में share करता है, JSON tree बन जाता है जिसमें वह sub-tree duplicated होती है। Cyclic references (जो YAML allow करता है) JSON में representable नहीं हैं।
YAML वास्तव में कहाँ use होता है
YAML आधुनिक infrastructure में हर जगह है: Kubernetes manifests (पूरा object model YAML convention द्वारा है; --- से separated multi-document files standard हैं), Docker Compose (services, networks, volumes के लिए docker-compose.yml), GitHub Actions (.github/workflows/*.yml: strict YAML 1.2 schema mostly observed लेकिन parser अभी भी on: को एक key के रूप में recognize करता है, एक Norway-Problem near-miss जिसे GitHub explicitly work around करता है), GitLab CI/CD, Ansible playbooks, CircleCI / Travis CI / Drone / Bitbucket Pipelines, Jekyll / Hugo / Eleventy / Gatsby / Astro front matter, OpenAPI / Swagger specs (officially «a JSON object that may be represented either in JSON or YAML»), Prometheus / Grafana / Loki / Tempo monitoring stack configuration, cloud-init (EC2/GCE/Azure VM first-boot provisioning), और AWS CloudFormation / Azure Resource Manager / Google Cloud Deployment Manager। इनमें से अधिकांश के लिए, YAML-to-JSON conversion तब essential है जब आप JSON-only protocols में configuration embed कर रहे हों, jq के साथ files compare कर रहे हों, या output को किसी ऐसे tool को feed कर रहे हों जो JSON expect करता है।
Browser-side conversion server-side से safer क्यों है
default settings के साथ PyYAML का yaml.load() किसी भी untrusted input पर !!python/object tag के माध्यम से arbitrary Python code execute कर सकता था, जो side effects वाले actual Python objects में deserialise होता है, CVE-2017-18342, CVSS v3.1 score 9.8 (Critical), PyYAML 5.1 (मार्च 2019) में unsafe default को deprecate करके और safe_load() को recommended entry point बनाकर fix किया। Java के SnakeYAML का अपना equivalent था (CVE-2022-1471, भी CVSS 9.8) arbitrary instantiation allow करने वाले Constructor class के आसपास। Rust के de-facto serde_yaml crate को मार्च 2024 में deprecate किया गया; ecosystem अभी भी एक successor (serde_yml, serde_yaml_ng, serde_norway) पर settle हो रहा है।
browser में js-yaml v4 के माध्यम से parsing run करना इन सब को sidestep करता है: compromise करने के लिए कोई server नहीं है, js-yaml में tags के माध्यम से arbitrary code execution का कोई concept नहीं है (unknown tags constructed objects के बजाय plain scalars बन जाते हैं), और v4 safer 1.2 schema पर default है। Absolutool tool इससे default रूप से benefit करता है।
अधिक प्रश्न
converter multi-document YAML files को कैसे handle करता है?
यह js-yaml के loadAll से load करता है, जो parsed documents का एक array return करता है, JSON output इसलिए एक JSON array है जिसमें प्रत्येक --- separated document के लिए एक element है। अगर आपके पास केवल single document है, तो आपको एक element वाला JSON array मिलेगा; explicit single-document semantics के लिए अपना input ---/... markers में wrap करें।
क्या मेरा Kubernetes manifest सही convert होगा?
लगभग हमेशा हाँ। Kubernetes mostly YAML 1.2-compatible content use करता है, और js-yaml v4 सभी standard primitives (strings, integers, booleans, nulls, sequences, mappings) plus anchors और aliases handle करता है। जो दो pieces survive नहीं करते वे हैं comments (stripped) और कोई भी anchors जो references के बजाय repeated content तक expand हो जाते हैं।
मेरा country code NO boolean के रूप में क्यों read हो रहा है?
इस converter में ऐसा नहीं होना चाहिए, js-yaml v4 YAML 1.2 / JSON-compatible schema पर default है, जो y/n/yes/no/on/off को booleans के रूप में recognize नहीं करता। अगर आप इसे किसी अन्य tool (PyYAML, उदाहरण के लिए) में hit कर रहे हैं, तो fix यह है कि value को quotes में wrap करें: country: "NO"।
file size limit क्या है?
upload widget पर 5 MB, लेकिन pasted content बड़ा हो सकता है अगर आपके browser में memory हो। bottleneck in-memory representation है, network नहीं, loop में कोई server नहीं है। ~50 MB से बड़ी files के लिए, एक desktop YAML toolchain (command line पर yq, उदाहरण के लिए) consider करें।