# YAML से JSON — और JSON से वापस YAML

दोनों दिशाएँ, और हर दिशा की कीमत भी बताई जाती है। इनमें से कुछ भी किसी और के सर्वर में पेस्ट नहीं होता।

> अपने ब्राउज़र में YAML को JSON और JSON को YAML में बदलिए। यह YAML 1.2 पढ़ता है, इसलिए yes और no स्ट्रिंग ही रहते हैं, और बताता है कि हर दिशा में क्या खोता है। कुछ भी अपलोड नहीं होता, इसलिए कोई कॉन्फ़िग फ़ाइल आपकी डिवाइस से बाहर नहीं जाती।

यह पेज एक इंटरैक्टिव टूल है जो पूरी तरह आपके ब्राउज़र में चलता है, https://abox.tools/hi/yaml-to-json/ पर — आप इसे जो भी देते हैं, वह कहीं अपलोड नहीं होता। आगे वह सब कुछ है जो यह पेज इस टूल के बारे में शब्दों में कहता है; इसे इस्तेमाल करने के लिए यह पता खोलें।

## यह टूल YAML और JSON फ़ाइलें **कभी अपलोड नहीं करता**। यहाँ कोई सर्वर है ही नहीं।

बदलना एक स्ट्रिंग पर की गई गणित है, और वह यहीं, इसी पेज पर होती है। दोनों पार्सर हाथ से लिखे हुए हैं और `src/` में हैं — `shared/parse-yaml.js` और `shared/parse-json.js` — इसके अलावा कुछ नहीं। इस टूल में किसी भी तरह की नेटवर्क सुविधा है ही नहीं — न कुछ लाने को, न कुछ भेजने को — और यहाँ इसका वज़न इस साइट की लगभग हर दूसरी जगह से ज़्यादा है: एक YAML फ़ाइल आम तौर पर डिप्लॉयमेंट कॉन्फ़िग होती है, और डिप्लॉयमेंट कॉन्फ़िग आम तौर पर होस्टनेम, बकेट नाम और सीक्रेट से भरी होती है।

- ✗ कोई अपलोड नहीं
- ✗ कोई खाता नहीं
- ✗ साइज़ की कोई सीमा नहीं
- ✓ ऑफ़लाइन चलता है
- ✓ ओपन सोर्स

## YAML को अपलोड किए बिना JSON में कैसे बदलें

1. **दिशा चुनिए।** *YAML से JSON* या *JSON से YAML*। मेन्यू के नीचे लिखी बात बताती है कि उस दिशा में क्या खोता है — आपके कुछ भी पेस्ट करने से पहले, बाद में नहीं।
2. **पेस्ट कीजिए, या फ़ाइल छोड़िए।** जो कुछ आप चुनकर कॉपी कर सकते हैं वह सब चलता है। सिलेक्टर पर छोड़ी गई फ़ाइल को आपका अपना ब्राउज़र पढ़कर बॉक्स में डाल देता है — छोड़ने के लिए अपलोड वाला कोई कदम है ही नहीं — और `.json` या `.yaml` एक्सटेंशन दिशा भी अपने आप तय कर देता है।
3. **इंडेंट चुनिए।** दो स्पेस, चार, या एक टैब। टैब सिर्फ़ JSON के लिए दिया जाता है: YAML स्पेस के हिसाब से तय होता है, और उसमें टैब वैध इंडेंट नहीं है।
4. **गड़बड़ी वहीं पढ़िए जहाँ गड़बड़ी है।** यहाँ नाकाम होने वाला पार्सर “पोज़िशन 4193 पर अनपेक्षित टोकन” कहने के बजाय बताता है कि उसे क्या मिला और किस लाइन तथा किस कॉलम पर। आम तौर पर इतना ही काफ़ी होता है कि कॉन्फ़िग फ़ाइल कुछ और खोले बिना ठीक हो जाए।
5. **नतीजा ले जाइए।** कॉपी कीजिए, या फ़ाइल के रूप में डाउनलोड कीजिए, जिसका नाम उसी फ़ॉर्मैट पर होगा जिसमें वह निकला।

## बॉक्स में और भी टूल

- [XML फ़ॉर्मैटर](https://abox.tools/hi/xml-formatter/): पढ़ने के लिए सजाया गया XML या भेजने के लिए दबाकर सपाट किया गया XML, और दोनों तरफ़ JSON में बदला हुआ। इनमें से कुछ भी किसी और के सर्वर में पेस्ट नहीं होता।
- [टेक्स्ट डिफ़](https://abox.tools/hi/text-diff/): दो टेक्स्ट भीतर, हर फ़र्क निशान लगाकर बाहर, पंक्ति-दर-पंक्ति और शब्द-दर-शब्द। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता।
- [Base64 एनकोडर-डिकोडर](https://abox.tools/hi/base64/): Base64, परसेंट एनकोडिंग, HTML एंटिटी, हेक्स और बैकस्लैश एस्केप, दोनों दिशाओं में। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता।
- [टेक्स्ट और फ़ाइलें साझा करें](https://abox.tools/hi/share-text/): साझा की गई चीज़ इसी खुले टैब में रहती है। पाठक उसे एन्क्रिप्टेड रूप में सीधे आपके ब्राउज़र से पाते हैं, और टैब बंद करते ही सब खत्म - किसी सर्वर पर कुछ नहीं रहता।

## सवाल

### क्या मेरा YAML कहीं अपलोड होता है?

नहीं। इस पेज के दोनों पार्सर और दोनों प्रिंटर ऐसे फ़ंक्शन हैं जो आपके अपने ब्राउज़र में, आपके अपने हार्डवेयर पर चलते हैं। इस टूल में किसी भी तरह की नेटवर्क सुविधा नहीं है — यह कभी कुछ मँगाता नहीं और कभी कुछ भेजता नहीं — और पेज की `Content-Security-Policy` में वे सारे पते लिखे हैं जिनसे यह संपर्क कर सकता है, जिनमें से एक भी हमारा नहीं है। डिप्लॉयमेंट कॉन्फ़िग के लिए इसे इस्तेमाल करने की वजह भी यही है: उनमें होस्टनेम, बकेट नाम और कभी-कभी कोई सीक्रेट भरा होता है जिसे कोई हटाना चाहता था, और उसे किसी और के कन्वर्टर में पेस्ट करना उसे दे देना है।

### YAML को JSON में बदलने पर क्या खोता है?

टिप्पणियाँ, क्योंकि JSON के पास उन्हें रखने की जगह नहीं है। ऐंकर, एलियस और टैग अंदाज़े के बजाय सीधे मना कर दिए जाते हैं — इनमें से हर एक ऐसा कुछ कहता है जो JSON कह ही नहीं सकता, और जो कन्वर्टर चुपचाप कोई व्याख्या चुन लेता, वह आपको ऐसा दस्तावेज़ थमा देता जो फ़ाइल की बात नहीं है। दूसरी दिशा कुछ नहीं खोती: हर JSON दस्तावेज़ पहले से ही एक YAML दस्तावेज़ है।

### मेरे YAML में no लिखा है और JSON में स्ट्रिंग आई। क्यों?

क्योंकि वह स्ट्रिंग ही है, और यहाँ 1.1 नहीं बल्कि YAML 1.2 पढ़ा जाता है। YAML 1.1 में `yes`, `no`, `on` और `off` बूलियन थे, और यही वह मशहूर गड़बड़ी है जो नॉर्वे के देश कोड को `false` बना देती है। YAML 1.2 ने इसे छोड़ दिया और यह भी: टेक्स्ट के अलावा कुछ और सिर्फ़ `true`, `false`, `null` और `~` पढ़े जाते हैं। दूसरी दिशा में वे शब्द *उद्धरण चिह्नों के साथ* वापस लिखे जाते हैं, हालाँकि यहाँ बिना उनके भी वे टेक्स्ट ही पढ़े जाते — क्योंकि फ़ाइल को आगे जो खोलेगा वह शायद ऐसा न करे। PyYAML आज भी डिफ़ॉल्ट रूप से 1.1 ही इस्तेमाल करता है। सख्ती से पढ़ना और सँभलकर लिखना ही वह इकलौता मेल है जो दोनों तरफ़ सही रहता है।

### क्या यह मेरी कुंजियों का क्रम बनाए रखता है?

हाँ, दोनों दिशाओं में, और यह सुनने में जितना लगता है उससे कठिन है। `JSON.parse` पर बना कोई कन्वर्टर पूर्णांक जैसी दिखने वाली कुंजियों को चुपचाप आगे खिसका देता है, तो `{"10":a,"2":b}` वापस `{"2":b,"10":a}` बनकर आता है। संख्याएँ वही अंक रखती हैं जो आपने टाइप किए, इसलिए बीस अंकों वाला कोई खाता नंबर अपने आखिरी तीन अंक डबल की वजह से नहीं खोता। अगर आप उन्हें *क्रम में* चाहते हैं तो एक चेकबॉक्स है, और वह कुंजियाँ जैसी पढ़ी जाती हैं उस हिसाब से क्रम लगाता है, न कि उनके कोड पॉइंट से।

### क्या यह एक साथ कई YAML दस्तावेज़ बदल सकता है?

नहीं, और यह कोई एक चुनने के बजाय ऐसा कह देता है। `---` से अलग की गई फ़ाइल में एक से ज़्यादा दस्तावेज़ होते हैं, और JSON में ऐसी कोई शक्ल नहीं है जिसका मतलब “कई दस्तावेज़” हो — ऐरे बनाना ऐसा दावा होता जो फ़ाइल ने कभी किया ही नहीं। इन्हें एक-एक करके बदलिए।

### यहाँ YAML फ़ॉर्मैटर क्यों नहीं है?

क्योंकि YAML की कोई दबी हुई शक्ल ऐसी नहीं जिसे लिखना सार्थक हो — छोटी शक्ल फ़्लो स्टाइल है, जो पढ़ी नहीं जाती, और न पढ़ा जाना उस वजह के ठीक उलट है जिसके लिए फ़ाइल YAML में रखी जाती है। JSON, XML, HTML और CSS सजाना [JSON फ़ॉर्मैटर](https://abox.tools/hi/json-formatter/) का काम है, और वह YAML भी सजाता है।

### फ़ाइल कितनी बड़ी हो सकती है?

यहाँ कोई सीमा रखी ही नहीं गई, क्योंकि उसके लिए पैसे देने वाला कोई सर्वर नहीं है। असली छत आपकी अपनी डिवाइस है: कुछ मेगाबाइट YAML ठीक रहता है, और बहुत लंबे दस्तावेज़ में पेज आपसे कीबोर्ड छीनने के बजाय आपके टाइप करने में ठहराव का इंतज़ार करता है और फिर बदलता है।

### क्या यह मुफ़्त है, और क्या खाता चाहिए?

यह मुफ़्त है, और कोई खाता नहीं, कोई साइन-इन नहीं, कोई ट्रायल नहीं और आप कितना पेस्ट करें इसकी कोई सीमा नहीं। साइट पर विज्ञापन हैं, उन्हीं से इसका खर्च चलता है; विज्ञापनों को आपके टेक्स्ट के बारे में कुछ नहीं दिया जाता।

### क्या यह ऑफ़लाइन चलता है?

हाँ। पेज एक बार लोड कीजिए, फिर इंटरनेट काट दीजिए और यह चलता रहता है। यही सबसे आसान तरीका भी है यह साबित करने का कि कुछ अपलोड नहीं हो रहा: जो टूल आपकी कॉन्फ़िग बदलने के लिए बाहर भेजता, वह तार निकालते ही रुक जाता।

## प्राइवेसी का यह दावा कैसे जाँचा जा सकता है

- **आप जो पेस्ट करते हैं उसके जाने की कोई जगह नहीं है।** Content-Security-Policy में वे सारे पते लिखे हैं जिनसे यह पेज संपर्क कर सकता है, और उनमें से एक भी हमारा नहीं है। यहाँ ऐसा कोई एंडपॉइंट नहीं है जहाँ पेस्ट की गई कॉन्फ़िग इकट्ठी की जा सके, और होता भी तो कोड में ऐसा कुछ नहीं है जो उसे वहाँ भेजे।
- **यहाँ कुछ भी कहीं से कुछ नहीं लाता।** पूरे `src/` में कहीं कोई `fetch`, कोई `XMLHttpRequest` और कोई `sendBeacon` नहीं है। दोनों पार्सर और दोनों प्रिंटर इसी पेज के फ़ंक्शन हैं जो एक स्ट्रिंग लेते हैं और एक स्ट्रिंग लौटाते हैं।
- **यह YAML 1.2 पढ़ता है, इसलिए नॉर्वे नॉर्वे ही रहता है।** YAML 1.1 में `no` एक बूलियन था, और यही वह मशहूर गड़बड़ी है जो नॉर्वे के देश कोड को `false` बना देती है। यहाँ 1.2 पढ़ा जाता है, जहाँ वह वही स्ट्रिंग है जैसा दिखता है। दूसरी दिशा में वे शब्द *उद्धरण चिह्नों के साथ* वापस लिखे जाते हैं, क्योंकि फ़ाइल को आगे जो खोलेगा वह अब भी 1.1 का रीडर हो सकता है। `tests/js/text-convert.test.js` दोनों हिस्से जाँचता है।
- **जो कन्वर्ज़न ईमानदार नहीं रह सकता, वह रुक जाता है।** YAML में कोई ऐंकर, एलियस या टैग कन्वर्ज़न को इस संदेश के साथ खत्म कर देता है कि वह किस लाइन पर है, बजाय ऐसा JSON दस्तावेज़ देने के जो चुपचाप कुछ और मतलब रखता हो। JSON के पास “वही नोड दो बार” कहने का कोई तरीका नहीं है, और कोई एक व्याख्या चुनना आपके लिए फ़ैसला करना होगा।
- **गूगल क्या लोड करता है, और उसे क्या नहीं दिया जाता।** विज्ञापन और माप वाली स्क्रिप्ट गूगल से आती हैं, और दान वाला बटन Buy Me a Coffee से। इनमें से किसी को भी आपके टेक्स्ट का एक अक्षर नहीं दिया जाता। जो भी लाइन उसे पढ़ती, पार्स करती या लिखती है, वह इसी ओरिजिन से आती है और रिपॉज़िटरी में दर्ज है।
- **यह ऑफ़लाइन चलता है।** नेटवर्क काट दीजिए और टूल जस का तस रहता है, क्योंकि इसमें कभी नेटवर्क वाला कदम था ही नहीं। इससे आसान सबूत कोई नहीं।

**खुद जाँच लीजिए।** ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा `dist` ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं: https://github.com/A-Box-of-Tools/website

सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए `config/site.toml`, उस रीडर के लिए `src/shared/parse-yaml.js` जो किसी ऐंकर का मतलब अंदाज़ने के बजाय उसे मना कर देता है, और `src/convert.js` यह समझने के लिए कि एक कन्वर्ज़न सिर्फ़ एक पार्सर और एक प्रिंटर क्यों है, जिनके बीच ऐसा कुछ नहीं जो दोनों फ़ॉर्मैट एक साथ जानता हो।
