JSON में मल्टीलाइन स्ट्रिंग्स


655

मैं JSON प्रारूप में कुछ डेटा फाइलें लिख रहा हूं और कुछ वास्तविक स्ट्रिंग मानों को कई लाइनों में विभाजित करना चाहता हूं। अजगर के JSON मॉड्यूल का उपयोग करने पर मुझे बहुत सारी त्रुटियां मिलती हैं, चाहे मैं उपयोग करता हूं \या \nभागने के रूप में।

क्या JSON में मल्टी-लाइन स्ट्रिंग्स होना संभव है? यह ज्यादातर दृश्य आराम के लिए है, इसलिए मुझे लगता है कि मैं सिर्फ अपने संपादक में वर्ड रैप चालू कर सकता हूं, लेकिन मैं थोड़े उत्सुक हूं ...



1
अपने डेटा को संरचना करें: मल्टीलाइन स्ट्रिंग को स्ट्रिंग्स के एक सरणी में तोड़ दें, और फिर बाद में उन्हें शामिल करें।
RubyTuesdayDONO

2
Hjson उपकरण का प्रयास करें। यह आपके मल्टीलाइन स्ट्रिंग को json में उचित json-format में बदल देगा।
गौरव

जवाबों:


401

JSON वास्तविक लाइन-ब्रेक की अनुमति नहीं देता है। आपको सभी पंक्ति विराम को बदलने की आवश्यकता है \n

उदाहरण के लिए:

"first line second line"

के साथ बचाया जा सकता है:

"first line\nsecond line"

ध्यान दें:

इसके लिए Python, इसे इस प्रकार लिखा जाना चाहिए:

"first line\\nsecond line"

\\बैकस्लैश से बचने के लिए कहाँ है, अन्यथा अजगर \nनियंत्रण चरित्र "नई लाइन" के रूप में व्यवहार करेगा


88
-1 ओपी "\ n" एस्केप सीक्वेंस का उपयोग कर रहा है। यह काम नहीं कर रहा है क्योंकि वे "\\ n" के रूप में बैकस्लैश से बच नहीं रहे हैं , इसलिए पायथन भागने के अनुक्रम को एक नई पंक्ति के चरित्र में परिवर्तित कर रहा है, बजाय इसे छोड़ने के कि शाब्दिक रूप से बैकस्लैश एक एन द्वारा पीछा किया जाता है, जैसा कि JSON को आवश्यकता है।
user359996

6
@ user359996 मुझे यकीन नहीं है कि यह सच है। मेरे लिए (सिर्फ JSON में डेटा संग्रहीत करना \nऔर इसे Curses के माध्यम से आउटपुट करना), \nठीक काम करने लगता है। यह दृश्य / प्रतिपादन इंजन पर निर्भर करता है, ऐसा लगता है।
ashes999

2
न्यूलाइन अनुक्रम वास्तव में प्लेटफ़ॉर्म-विशिष्ट (cf. en.wikipedia.org/wiki/Newline#Represignations ) हैं। हालांकि, ऑर्बिट के उत्तर में @Lightness Races के अनुसार, JSON व्याकरण में न तो कर्सर-रिटर्न और न ही लाइन-फीड वर्ण हैं। मैं वास्तव में पायथन प्रोग्रामर नहीं हूं, इसलिए मुझे यकीन नहीं है कि आपके मामले में क्या चल रहा है, लेकिन या तो आपका पार्सर टूट गया है या आप इसे नहीं पारित कर रहे हैं जो आपको लगता है कि आप हैं। हो सकता है कि इस जवाब बताते हैं बेहतर: stackoverflow.com/a/9295597/359996 । विशेष रूप से डबल भागने के बारे में ध्यान दें।
user359996

5
@ नवाज: "\ n" और "\ r" क्रमशः लाइनफीड और कैरिज वापसी के क्रम से बच रहे हैं । वे शाब्दिक लाइनफ़ीड और गाड़ी-वापसी नियंत्रण वर्ण नहीं हैं । इसे और अधिक स्पष्ट करने के लिए एक अतिरिक्त उदाहरण के रूप में, विचार करें कि "\\" बैकस्लैश के लिए एक भागने का क्रम है, जैसा कि शाब्दिक बैकलैश के विपरीत है। JSON व्याकरण स्पष्ट रूप से नियंत्रण वर्णों को छोड़ देता है (cf. "char" परिभाषा), और इसके बजाय एस्केप अनुक्रम (\\, \ r, \ n, आदि) के माध्यम से उनके प्रतिनिधित्व के लिए प्रदान करता है।
1935 पर user359996

2
@ user359996: हाँ .. मैंने देखा कि बाद में, हालांकि मैं अपनी पुरानी टिप्पणी ऐसे ही रख रहा हूं, यदि कोई और भी इसी संदेह के साथ आता है, तो हमारी चर्चा उनकी मदद कर सकती है। इसकी पुष्टि करने के लिए धन्यवाद BTW।
नवाज

197

मुझे यह एक छोटी सी Node.js परियोजना के लिए करना पड़ा है और इस काम के आसपास मिला है :

{
 "modify_head": [

  "<script type='text/javascript'>",
  "<!--",
  "  function drawSomeText(id) {",
  "  var pjs = Processing.getInstanceById(id);",
  "  var text = document.getElementById('inputtext').value;",
  "  pjs.drawText(text);}",
  "-->",
  "</script>"

 ],

 "modify_body": [

  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"

 ],
}

यह मेरे लिए काफी साफ-सुथरा लगता है, इसमें से मुझे हर जगह डबल कोट्स का इस्तेमाल करना पड़ता है। हालांकि, अन्यथा, मैं शायद, YAML का उपयोग कर सकता हूं, लेकिन इसमें अन्य नुकसान हैं और मूल रूप से समर्थित नहीं है। एक बार पार्स करने के बाद, मैं बस का उपयोग करता हूं myData.modify_head.join('\n')या myData.modify_head.join(), इस पर निर्भर करता हूं कि मुझे प्रत्येक स्ट्रिंग के बाद एक लाइन ब्रेक चाहिए या नहीं।


40
यह एक विशिष्ट सेटिंग के लिए एक समाधान है, जरूरी नहीं कि प्रश्न से संबंधित हो। आप जो कुछ भी बनाते हैं, वह मल्टीलाइन स्ट्रिंग्स नहीं हैं (जो वैसे भी संभव नहीं है), लेकिन अंदर स्ट्रिंग्स के साथ सरणियाँ
सैमुअल रिवास

3
यह दिखाता है कि स्ट्रिंग्स में न्यूलाइन कैसे डालें, जो सवाल का जवाब नहीं देता है। यह उत्तर देता है।
fgrieu

1
fgrieu - कोई आसानी से एक नई रेखा को जोड़े बिना तारों को समेट सकता है। उस छोटे से परिवर्तन के साथ, यह मल्टीलाइन स्ट्रिंग्स के लिए एक समाधान प्रदान करता है (जब तक आप JSON स्कीमा को निर्दिष्ट करने के नियंत्रण में हैं)। मैं इसके साथ उत्तर को बेहतर बनाने की कोशिश करूंगा।
ड्रोब

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

JSON आविष्कारक के आरक्षण के बावजूद, मैंने इसका उपयोग टिप्पणी जोड़ने के लिए किया (जावास्क्रिप्ट भाग के बिना, लेकिन केवल [] और अल्पविराम) संभव भविष्य के अनुचर की मदद करने के लिए टिप्पणी जोड़ने के लिए जो मेरी छोटी JSON फ़ाइल को हाथ से संपादित कर सकता है।
व्हर्ल माइंड

116

दुर्भाग्य से यहाँ कई उत्तर इस सवाल को संबोधित करते हैं कि स्ट्रिंग डेटा में एक नया वर्ण कैसे रखा जाए। सवाल यह है कि कोड के कई लाइनों में स्ट्रिंग मान को विभाजित करके कोड को अच्छे कैसे बनाया जाए। (और यहां तक ​​कि उत्तर जो इसे पहचानते हैं, "समाधान" प्रदान करते हैं जो मानते हैं कि डेटा प्रतिनिधित्व को बदलने के लिए स्वतंत्र है, जो कई मामलों में एक नहीं है।)

और इससे भी बुरी खबर यह है कि इसका कोई अच्छा जवाब नहीं है।

कई प्रोग्रामिंग भाषाओं में, भले ही वे स्पष्ट रूप से लाइनों के बीच विभाजन का समर्थन नहीं करते हैं, फिर भी आप वांछित प्रभाव प्राप्त करने के लिए स्ट्रिंग संयोजन का उपयोग कर सकते हैं; और जब तक संकलक भयानक नहीं है तब तक यह ठीक है।

लेकिन json एक प्रोग्रामिंग भाषा नहीं है; यह सिर्फ एक डेटा प्रतिनिधित्व है। आप इसे स्ट्रिंग को संक्षिप्त करने के लिए नहीं कह सकते। न ही इसके (काफी छोटे) व्याकरण में कई लाइनों पर एक स्ट्रिंग का प्रतिनिधित्व करने के लिए कोई सुविधा शामिल है।

किसी प्रकार के एक पूर्व-प्रोसेसर को तैयार करने का छोटा (और, एक के लिए, इस मुद्दे को हल करने के लिए प्रभावी ढंग से अपनी भाषा बनाने का मन नहीं करता), इस समस्या का एक सामान्य समाधान नहीं है। यदि आप डेटा प्रारूप को बदल सकते हैं, तो आप स्ट्रिंग की एक सरणी स्थानापन्न कर सकते हैं। अन्यथा, यह कई तरीकों में से एक है, जो कि मानव-पठनीयता के लिए डिज़ाइन नहीं किया गया है।


3
यह स्पष्ट नहीं है कि ओपी क्या चाहता है, स्ट्रिंग में न्यूलाइन्स, या स्ट्रिंग को बेहतर ढंग से व्यवस्थित करें ...
9ilsdx 9rvj 0lo

3
@ 9ilsdx9rvj0lo: नहीं, यह नहीं है।
मार्क एडल्सबर्गर

"सवाल यह है कि कोड की कई लाइनों में स्ट्रिंग मान को विभाजित करके कोड को अच्छा कैसे बनाया जाए ...": पायथन में मल्टी-लाइन स्टेटमेंट के समाधान के लिए, stackoverflow.com/questions/53162/… देखें । मल्टी-लाइन JSON और मल्टी-लाइन पायथन के बीच अंतर है। मल्टी-लाइन JSON '\' के बाद JSON में 'n' का उपयोग करता है, अर्थात स्ट्रिंग में "\ n"। मल्टी-लाइन पाइथन स्टेटमेंट, '\' का उपयोग करें, उसके बाद '\ n' अर्थात लाइन पर एक पीछे आने वाला बैकस्लैश जिसे जारी रखना है। Windows प्रारूप: जहाँ उपयुक्त हो, \ n के साथ \ n बदलें!
इवान

106

विनिर्देश बाहर की जाँच करें ! JSON व्याकरण के चार उत्पादन निम्न मान ले सकते हैं:

  • किसी भी-यूनिकोड-चरित्र-except- "-या- \-या नियंत्रण-चरित्र
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u चार हेक्स अंक

Newlines "नियंत्रण वर्ण" हैं इसलिए, नहीं, आपके पास अपनी स्ट्रिंग के भीतर एक शाब्दिक नई पंक्ति नहीं हो सकती है। हालाँकि आप इसके संयोजन का उपयोग करके इसे एनकोड कर सकते हैं \nऔर \rआपको इसकी आवश्यकता होगी।



3
यह सही उत्तर है क्योंकि यह कोई अस्पष्टता नहीं छोड़ता है। विनिर्देशन के अनुसार नई लाइनों की अनुमति है, जब तक कि वे ठीक से नियंत्रण चरित्र के साथ बच गए हों।
रयान

JSON में @AliKhaki \ n प्रश्न द्वारा मांगे गए परिणामों को पूरा नहीं करेगा। या तो आप कुछ और सोच रहे हैं (यानी न्यूलाइन अक्षरों को एम्बेड करना), या आप कुछ प्रोग्रामिंग भाषा में एक स्ट्रिंग शाब्दिक (JSON युक्त) में एक नई लाइन के बारे में बात कर रहे हैं, जो फिर से कुछ अलग है।
ऑर्बिट

@LightnessRacesinOrbit हां मैं स्ट्रिंग में न्यूलाइन की तलाश कर रहा हूं
अली खाकी

46

JSON पठनीयता के लिए लाइनों को तोड़ने की अनुमति नहीं देता है।

आपकी सबसे अच्छी शर्त एक आईडीई का उपयोग करना है जो आपके लिए लाइन-रैप करेगा।


1
BBEdit जैसा संपादक जो "सॉफ्ट" लाइन रैप का समर्थन करता है, वह आदर्श है। यह पाठ को लपेटता है, इसलिए यह सभी संपादक विंडो के दृश्यमान क्षेत्र के भीतर दिखाई देता है, लेकिन आपके द्वारा टाइप की जाने वाली लाइन एंडिंग केवल (उदाहरण के लिए, कैरेज रिटर्न मारते हुए) फ़ाइल में सहेजे जाने पर बनी रहती है। कोड ट्रिक्स या हैक्स का सहारा लिए बिना JSON को वास्तव में लंबे स्ट्रिंग्स के साथ संपादित करना आसान बनाता है।
cshotton

44

यह वास्तव में एक पुराना सवाल है, लेकिन मैं इस पर एक खोज पर आया था और मुझे लगता है कि मुझे आपकी समस्या का स्रोत पता है।

JSON अपने डेटा में "वास्तविक" नईलाइन्स की अनुमति नहीं देता है; यह केवल नई सुर्खियों से बच सकता है। @YOU से उत्तर देखें । प्रश्न के अनुसार, ऐसा लगता है कि आपने पायथन में दो तरीकों से लाइन ब्रेक से बचने का प्रयास किया: लाइन निरंतरता चरित्र ( ) का उपयोग करके या भागने के रूप में उपयोग करके ।"\""\n"

लेकिन ध्यान रखें: यदि आप अजगर में एक स्ट्रिंग का उपयोग कर रहे हैं, तो विशेष बच पात्रों ( "\t", "\n") वास्तविक नियंत्रण वर्णों में अनुवादित हैं! "\n"ASCII नियंत्रण चरित्र एक नई पंक्ति चरित्र है, जो ठीक चरित्र कि JSON में गैर कानूनी है है का प्रतिनिधित्व करने के साथ प्रतिस्थापित किया जाएगा। (लाइन निरंतरता वर्ण के लिए, यह केवल नई पंक्ति को बाहर ले जाता है।)

तो आपको जो करने की ज़रूरत है वह है पायथन को पात्रों से बचने के लिए। आप एक कच्ची स्ट्रिंग का उपयोग करके ऐसा कर सकते हैं ( rजैसे कि स्ट्रिंग के सामने रखें, जैसे कि r"abc\ndef"या नई लाइन के सामने एक अतिरिक्त स्लैश को शामिल करके "abc\\ndef") ( )।

उपरोक्त दोनों "\n"वसीयतें वास्तविक न्यूलाइन ASCII नियंत्रण चरित्र के साथ बदलने के बजाय , "\n"दो शाब्दिक वर्णों के रूप में छोड़ देंगी , जो तब JSON एक नई पंक्ति से बचने के रूप में व्याख्या कर सकती है।


12

संपत्ति मान को स्ट्रिंग्स के एक सरणी के रूप में लिखें। जैसे उदाहरण यहाँ दिए गए https://gun.io/blog/multi-line-strings-in-json/ । ये सहायता करेगा।

हम निम्नलिखित की तरह हमेशा मल्टीलाइन स्ट्रिंग्स के लिए ऐरे ऑफ़ स्ट्रिंग्स का उपयोग कर सकते हैं।

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

और हम आसानी से मल्टी लाइन फैशन में सामग्री प्रदर्शित करने के लिए सरणी को पुनरावृत्त कर सकते हैं।


1
मैं आपको सुझाव दूंगा कि आप लिंक से अपने उत्तर में जानकारी जोड़ें, क्योंकि भविष्य में लिंक टूट सकते हैं।
यंगहॉबिट

5
लेकिन उनके पास आपके पास एक सरणी है, न कि एक स्ट्रिंग। एक सरणी एक स्ट्रिंग नहीं है। अवधि।
9ilsdx 9rvj 0lo

बस यही सोच रहा था। अच्छा!
फिलिप जैकब्स

12

Json5 (लोडर) का उपयोग https://json5.org/ देखें - उदाहरण (json5 द्वारा)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}

ओपी ने जो सवाल किया। कम से कम अगर वह json5 का उपयोग कर सकता है।
nomen

10

क्या JSON में मल्टी-लाइन स्ट्रिंग्स होना संभव है?

हाँ। मैंने अभी F12 दबाकर, कंसोल पर क्लिक करके और स्क्रीन के नीचे टाइप करके अपने फ़ायरफ़ॉक्स वेब ब्राउज़र से अभी इसका परीक्षण किया है।

x={text:"hello\nworld"}

ऑब्जेक्ट एक्स सिर्फ एक JSON प्रारूप स्ट्रिंग से बनाया गया है जिसमें एक बहु-लाइन स्ट्रिंग है।

console.log(x.text)
hello
world

x.text यह प्रदर्शित करता है कि यह एक बहु-पंक्ति स्ट्रिंग है।

इन दो परीक्षणों से पता चलता है कि फ़ायरफ़ॉक्स का जावास्क्रिप्ट दुभाषिया मल्टीलाइन स्ट्रिंग्स के साथ JSON बनाने और उपयोग करने के लिए खुश है।

जावास्क्रिप्ट इंटरप्रेटर के साथ अधिक परीक्षण JSON.stringifyऔर JSON.parseएक वस्तु को जेईएस में मल्टीलाइन स्ट्रिंग्स युक्त एक वस्तु में परिवर्तित कर सकते हैं और इसे फिर से पार्स कर सकते हैं, जिसमें कोई समस्या नहीं है।

मैंने अतीत में शेक्सपियर के संपूर्ण कार्यों को एक JSON ऑब्जेक्ट में एक संपत्ति के रूप में संग्रहीत किया है और फिर इसे इंटरनेट पर भेज दिया है, अनियंत्रित।

उदाहरण

यहाँ एक दो लाइन स्ट्रिंग है जो तीन लाइनों में प्रवेश करती है

x={text:"expert\
s\nex\
change"}

हम वस्तु को प्रदर्शित कर सकते हैं

console.log(x)

दे रही है

Object { text: "experts\nexchange" }

या स्ट्रिंग

console.log(x.text)

दे रही है

experts
exchange

\ N का उपयोग करने से स्ट्रिंग परिणाम में पंक्तियों की समाप्ति और एकाधिक इनपुट लाइनों को लाइन के अंत में just \ का उपयोग करके प्राप्त किया जाता है।

व्यवहार में आप स्ट्रिंग में मौजूद लोगों के साथ अपनी लाइन एंडिंग्स को सिंक्रनाइज़ करना चाहते हैं, जैसे

x={text:"experts\n\
exchange"}

मल्टी-लाइन स्ट्रिंग लंबाई

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11

ध्यान दें कि न्यूलाइन के साथ स्ट्रिंग स्पेस के साथ स्ट्रिंग से अधिक लंबी नहीं है। भले ही कीबोर्ड पर दो वर्ण टाइप किए गए हों ('\' और 'n'), केवल एक वर्ण स्ट्रिंग में संग्रहीत होता है।


3
एक जावास्क्रिप्ट स्ट्रिंग प्रारूप रीडर एक JSON स्ट्रिंग प्रारूप रीडर और इसके विपरीत नहीं है, इसलिए जब यह काम करने के लिए होता है, तो जावास्क्रिप्ट कंसोल भी स्वीकार करता है x={"a":NaN}और x={"a":"a \<literal newline with SHIFT>b"}, जो JSON नहीं हैं, लेकिन
बिल्ली

9

के \r\nसाथ सभी घटनाओं को बदलने के लिए रेगेक्स का उपयोग करें \\n

यह मेरे लिए स्काला में काम करता है।

val newstr = str.replace("\r\n", "\\n")

3 बैकस्लैश क्यों?
नेक्सस

6
@neXus मुझे नहीं पता, लेकिन किसी ने इसे 3 बैकस्लैश में संपादित किया था। इसे सही करने के लिए LightnessRacesInOrbit का धन्यवाद।
सिकंदर

5

यदि आप Node.js का उपयोग करने के इच्छुक हैं, तो आप यह कर सकते हैं:

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

आप Node.js के साथ आयात कर सकते हैं और इसे JSON में आसानी से बदल सकते हैं:

echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`

और आपको मिलता है:

{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}

यह कैसे काम करता है : आप एक जेएस मॉड्यूल को लोड करने के लिए Node.js का उपयोग करते हैं, जो एक JS ऑब्जेक्ट बनाता है जो आसानी से NSON.js. द्वारा JSON को कड़ा किया जा सकता है। -E विकल्प स्ट्रिंग का मूल्यांकन करता है, और -pविकल्प अंतिम Node.js ऑपरेशन के स्टडआउट के रिटर्न परिणाम को गूँजता है।

यदि आप एक .js स्क्रिप्ट लोड करना चाहते हैं जो एक अलग कार्यशील निर्देशिका में है, तो आपको "" और '' स्ट्रिंग्स को स्विच करना होगा:

my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`

-4

base64एन्कोडेड स्ट्रिंग मान का उपयोग करने का प्रयास करें । ज्यादातर समय मेरे लिए काम किया।

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

base64एन्कोडेड स्ट्रिंग लुक के बाद

{
    "singleLine": "Some singleline String",
    "multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
} 

base64 एन्कोडिंग और डिकोडिंग सभी भाषाओं में उपलब्ध है।


7
आपको इसे प्रदर्शित करने के लिए विशेष कोड की आवश्यकता है, आप एक स्ट्रिंग को एक सरणी में बदल रहे हैं। यह एक समाधान नहीं है
tom10271

3
मुझे लगता है कि यह एक बुरा विचार है - यह अनावश्यक रूप से सामग्री को बाधित करता है और इसे बनाने और उपभोग करने के लिए अतिरिक्त कोड, समय, मेमोरी और टूल की आवश्यकता होती है। स्ट्रिंग के माध्यम से स्कैनिंग और पाठ्यक्रम के विशेष वर्णों को बदलने के लिए अतिरिक्त कोड, समय और मेमोरी की आवश्यकता होती है, लेकिन निश्चित रूप से बेस 64 एन्कोडिंग और डिकोडिंग से कम
सेमीनिनो

यह एक बुरा विचार है क्योंकि JSON की पठनीयता समाप्त हो गई है, और @ tom10271 की तरह भी उल्लेख किया गया है, आपको json का उपयोग करने के लिए अतिरिक्त ऑपरेशन की आवश्यकता है
T90

-23

txt फ़ाइल पर बहुस्तरीय पाठ डालें और फिर

var str = {
    text: cat('path_to_file/text.txt')
}

(यह mongoDB पर काम करता है)


11
-1: यह एक भ्रामक उत्तर है। यह न तो वैध JSON है और न ही यह जावास्क्रिप्ट में काम करता है क्योंकि इसका कोई फ़ंक्शन नहीं है cat
मार्टिन शूफू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.