2009-04-29 14 views
25

मैंने हाल ही में JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) के बारे में सुना है। क्या कोई यह समझा सकता है कि इसे क्यों माना जाता है (कुछ वेबसाइट/ब्लॉग/आदि) महत्वपूर्ण होने के लिए क्यों? हमारे पास पहले से एक्सएमएल है, जेएसओएन बेहतर क्यों है ('जावास्क्रिप्ट के मूल निवासी' होने के अलावा)?JSON क्यों महत्वपूर्ण है?

संपादित करें: हम्म, मुख्य जवाब विषय होने के लिए 'यह छोटा होता है' लगता है। हालांकि, तथ्य यह है कि यह डोमेन पर डेटा लाने की अनुमति देता है, मेरे लिए महत्वपूर्ण लगता है। या यह अभ्यास में है (अभी तक) ज्यादा इस्तेमाल नहीं किया?

+8

मैंने सुना है वे OEML करने के लिए XML का नाम बदलने के –

+2

(इंजीनियर मार्कअप लैंग्वेज से अधिक) कैसे JSON अलग वर्ण एन्कोडिंग का क्या करता है (XML करता है) जा रहे थे। क्या JSON प्रतिनिधित्व में कोई अंतर्निहित वर्ण एन्कोडिंग है? –

+1

किसी अन्य डोमेन से प्राप्त होने वाले डेटा को वास्तव में एक्सएमएल या जेएसओएन * प्रारूप * के लिए एक सुविधा नहीं है। यह एक ब्राउज़र से संबंधित चीज है। –

उत्तर

0

यह है कि यह बेहतर है, लेकिन यह बहुत सी बातें एक साथ टाई कर सकते हैं मैनुअल पार्स बिना सहज आंकड़ा अंतरण अनुमति देने के लिए है कि नहीं है!

उदाहरण जावास्क्रिप्ट के लिए -> सी # वेब सेवा -> जावास्क्रिप्ट

+0

मुझे नहीं लगता कि यह तर्क के रूप में गिना जाता है कि जावास्क्रिप्ट में भी अक्सर JSON को eval'd नहीं किया जाता है लेकिन सुरक्षा कारणों से पार्स किया जाता है। –

+0

@ बेनेडिक्ट ईगर - eval आने के लिए एक नया प्रतिस्थापन है जो evon के जोखिम के बिना JSON का मूल्यांकन करेगा। इसके अलावा यदि JSON एक विश्वसनीय स्रोत से आ रहा है तो इसे सामान्य रूप से eval'd किया जाएगा। – stevehipwell

13

JSON आम तौर पर अपनी एक्सएमएल बराबर की तुलना में काफी छोटा होता है। छोटे स्थानांतरण का अर्थ है तेज़ स्थानांतरण, जिसके परिणामस्वरूप बेहतर उपयोगकर्ता अनुभव होता है।

+0

मैं इस बात से सहमत नहीं हूं कि जेसन छोटा है। '<व्यक्ति का नाम = 'जॉन डो' टैग = 'मित्र पुरुष' />' कॉम्पैक्ट एक्सएमएल प्रारूप है। 44 वर्ण कॉम्पैक्ट json है: '{व्यक्ति: {" नाम ":" जॉन डो "," टैग "[" दोस्त "," पुरुष "]}}' 52 वर्ण। एक्सएमएल के पक्ष में 25% अंतर है। एक्सएमएल * बड़ा हो सकता है, लेकिन ऐसा नहीं होना चाहिए। – Cheeso

+4

मैं सहमत हूं, इसलिए "आम तौर पर" शब्द का उपयोग। एक बार आपके पास जटिल वस्तुओं के सरणी हो जाने पर, एक्सएमएल जेएसओएन से बड़ा हो जाता है। निश्चित रूप से "आम तौर पर" शब्द का गलत मिसाल डाउनवोट के लायक नहीं है? –

+1

आपका कॉम्पैक्ट JSON गलत है, यह '{" नाम "होना चाहिए:" जॉन डो "," टैग ": [" दोस्त "," पुरुष "]}'। यह इसे 45 वर्ण बनाता है, जो एक्सएमएल से अभी भी बड़ा है लेकिन केवल 1 वर्ण से है। –

4

इन वेब पृष्ठों में मदद कर सकते हैं:

  1. JSON - The Fat Free alternative to xml
  2. Why JSON is Important to You!
+0

दूसरी कड़ी से "डेटा एक्सएमएल तो अजाक्स ही डोमेन (वेबसाइट) कि अजाक्स अनुप्रयोग से आया से डेटा प्राप्त करने में तक ही सीमित है के रूप में स्वरूपित है, तो। डेटा JSON के रूप में स्वरूपित है, तो अजाक्स डोमेन के बीच यात्रा कर सकते हैं" यह सही नहीं है, है ना? –

+0

ब्रायन, मुझे लगता है कि आप सही हैं। सुझाव दें कि दूसरे लिंक को संदिग्ध माना जाता है - यह सिर्फ अपने मिशन में सवाल का जवाब देना प्रतीत होता है, भले ही यह स्थानों में इसे प्राप्त करने में विफल रहता है। –

+0

@ सैम। काफी उचित। धन्यवाद। –

19

एक्सएमएल कई कमियां भी हैं:

  • यह भारी है!
  • यह सामग्री का एक पदानुक्रमिक प्रतिनिधित्व प्रदान करता है जो बिल्कुल जावास्क्रिप्ट ऑब्जेक्ट मॉडल के समान नहीं है (लेकिन बहुत समान है)।
  • जावास्क्रिप्ट हर जगह उपलब्ध है। किसी बाहरी पार्सर्स के बिना, आप JS JSs को सीधे JS दुभाषिया के साथ संसाधित कर सकते हैं।

जाहिर है यह एक्सएमएल पूरी तरह से बदलने के लिए मतलब नहीं है। जेएस आधारित वेब ऐप्स के लिए, इसके फायदे उपयोगी हो सकते हैं।

+1

'जावास्क्रिप्ट हर जगह उपलब्ध है' से आपका क्या मतलब है? यदि मैं अपने जावा एप्लिकेशन को कॉच डीबी इंस्टेंस में इंटरफ़ेस करता हूं, तो मेरे पास XML पार्सर्स मूल रूप से उपलब्ध हैं, लेकिन कोई जावास्क्रिप्ट पार्सर नहीं है। –

+1

इस अर्थ में हर जगह का मतलब है "हर कंप्यूटर पर (एक आधुनिक ब्राउज़र के साथ)।" –

+0

@ रबरर्स्की: सटीक वही ऑब्जेक्ट मॉडल होने के नाते भी एक बड़ा फायदा है जिसे कभी-कभी कम किया जा सकता है। –

12

JSON अधिक संक्षिप्त है। एक्सएमएल:

<person> 
    <name>John Doe</name> 
    <tags> 
     <tag>friend</tag> 
     <tag>male</tag> 
    </tags> 
</person> 

JSON:

{"name": "John Doe", "tags": ["friend", "male"]} 

वहाँ कम ओवरलैपिंग सुविधाओं, भी है। उदाहरण के लिए, एक्सएमएल में तत्वों (ऊपर के रूप में), बनाम गुणों (<person name="John Doe">) का उपयोग करने के बीच चयन करने के बीच तनाव होता है।

+9

मुझे वास्तव में पढ़ने के लिए एक्सएमएल बहुत आसान लगता है। –

+0

बाहरी खाली स्थान के की अनदेखी करते हुए कि मोटे तौर पर ध्यान में बनाम 78 लेकिन भालू 44 अक्षर हैं जो नाम की तरह किसी एक चाइल्ड तत्व एक विशेषता (एक और 7 या तो पात्रों की बचत) के साथ प्रतिस्थापित किया जा सकता है। – cletus

+4

@ स्टेव, जब डेटा इंटरचेंज प्रारूपों पर पठनीयता महत्वपूर्ण थी? – James

1

JSON जावास्क्रिप्ट वस्तुओं में डेटा को क्रमानुसार करने का तरीका है। सिंटैक्स भाषा से लिया जाता है, इसलिए इसे जावास्क्रिप्ट से निपटने वाले डेवलपर से परिचित होना चाहिए, और - किसी ऑब्जेक्ट की स्ट्रिंगिफिकेशन होने के नाते - यह पूर्ण रूप से एक्सएमएल व्युत्पन्न की तुलना में ब्राउज़र के भीतर बातचीत के लिए एक अधिक प्राकृतिक धारावाहिक विधि है (सभी मनमानी डिजाइन निर्णयों के साथ जो तात्पर्य है)।

यह हल्का और सहज है।

11

JSON लोकप्रिय प्रयोग में आया इसका मुख्य कारण यह एक ही मूल के वेब ब्राउज़र में इस्तेमाल नीति को दरकिनार और इस तरह मैशप की अनुमति देने के लिए एक रास्ता प्रदान करता है।

मान लें कि आप डोमेन ए पर एक वेब सेवा लिख ​​रहे हैं।आप डोमेन बी से XML डेटा लोड कर सकते हैं नहीं है और यह पार्स क्योंकि एक ही रास्ता है कि XMLHttpRequest होगा ऐसा करने के लिए, और XMLHttpRequest मूल रूप से युक्त पेज वाले डोमेन पर केवल यूआरएल से बात करने के लिए एक ही मूल नीति द्वारा सीमित था।

ऐसा लगता है कि कई कारणों से के लिए, आप मूल भर में < स्क्रिप्ट > टैग का अनुरोध करने की अनुमति है। चालाक लोगों को एहसास हुआ कि यह XMLHttpRequest के साथ सीमा के आसपास काम करने का एक अच्छा तरीका था। एक्सएमएल लौटने वाले सर्वर के बजाय, यह जावास्क्रिप्ट ऑब्जेक्ट और सरणी अक्षरों की एक श्रृंखला वापस कर सकता है।

(बोनस सवाल पाठक के लिए एक व्यायाम के रूप में छोड़ दिया: क्यों < स्क्रिप्ट src है = "..." > बिना सर्वर विकल्प के रूप में लेकिन एक्सएचआर नहीं है डोमेन के बीच की अनुमति दी)

बेशक

, लौटने क्योंकि कुछ चर के लिए मान निर्दिष्ट के बिना, आप इसके साथ कुछ नहीं कर सकते एक < स्क्रिप्ट > वस्तु शाब्दिक से ज्यादा कुछ नहीं के होते हैं जो उपयोगी नहीं है। इस प्रकार, अधिकांश सेवाएं जेएसओएनपी (http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/) नामक जेएसओएन के एक प्रकार का उपयोग करती हैं।

मैशप की लोकप्रियता में वृद्धि के साथ

, लोगों को एहसास हुआ कि JSON सामान्य रूप में एक सुविधाजनक डाटा इंटरचेंज प्रारूप था, खासकर जब जावास्क्रिप्ट चैनल के एक छोर है। उदाहरण के लिए, जेएसओएन क्रोमियम में बड़े पैमाने पर उपयोग किया जाता है, यहां तक ​​कि उन मामलों में जहां सी ++ दोनों तरफ है। सरल डेटा का प्रतिनिधित्व करने के लिए यह एक अच्छा हल्का तरीका है, कि कई पार्सर्स के लिए अच्छे पार्सर्स मौजूद हैं।

Amusingly, < स्क्रिप्ट > टैग का उपयोग मैशप करने के लिए अविश्वसनीय रूप से असुरक्षित है क्योंकि यह अनिवार्य रूप से उद्देश्य पर अपने आप को XSS'ing जाता है। तो मूल JSON (http://ejohn.org/blog/native-json-support-is-required/) पेश किया जाना था, जो प्रारूप के मूल लाभों को रोकता है। लेकिन उस समय तक, यह पहले से ही सुपर लोकप्रिय :)

+0

मुझे इस मूल कहानी को समझ में नहीं आया है। एक जावास्क्रिप्ट फ़ंक्शन लिखना तुच्छ है जो एक (अनपेक्षित) XML दस्तावेज़ देता है। आप इस हैक का उपयोग एक्सएमएल को पूरी तरह से नए सीरियलाइजेशन प्रारूप प्रदान करने के लिए आसानी से उपयोग करने के लिए कर सकते हैं। –

+0

यह सच है, आप बस एक्सएमएल की एक स्ट्रिंग वापस कर सकते हैं और फिर इसे पार्स कर सकते हैं। लेकिन स्ट्रिंग को जावास्क्रिप्ट स्ट्रिंग के अंदर सावधानी से बचाना होगा। लोगों ने पाया खुद को गतिशील रूप से पैदा: returnData ("< डेटा foo = \" बार \ "> ...</foo > ") ... और खुद पूछ क्यों परेशान जब वे सिर्फ वस्तुओं और सरणियों लौट सकते हैं सीधे। और जैसे ही आप उस पथ नीचे जाना, आपको लगता है कोई अलग से पार्स चरण के साथ देशी वस्तुओं और सरणियों के साथ काम कर रहा है कि सामान्य रूप से एक बेहतर विचार है। लेकिन मुझे लगता है कि मैशप हैं कि जेएसओएन कैसे शुरू हुआ, या कम से कम प्राथमिक कारणों में से एक। –

2

यह तुम क्या करने जा रहे हैं पर निर्भर करता है था। यहां बहुत सारे उत्तर हैं जो एक्सएमएल पर जेएसओएन पसंद करते हैं। यदि आप गहराई से देखते हैं तो कोई बड़ा अंतर नहीं है।

आप वस्तुओं की एक पेड़ है, तो आप जावास्क्रिप्ट का केवल पेड़ वापस वस्तुओं मिलता है। यदि आप वापस मोड़ की तुलना में ओओपी शैली का उपयोग करने के लिए तनाव को देखते हैं। मान लें कि आपके पास एक पेड़ में निर्मित ए, बी, सी प्रकार का ऑब्जेक्ट है। आप उन्हें JSON पर serialzed करने में आसानी से सक्षम कर सकते हैं। यदि आप उन्हें वापस पढ़ते हैं तो केवल जावास्क्रिप्ट ऑब्जेक्ट का पेड़ प्राप्त करें। अपने ए, बी, सी का पुनर्निर्माण करने के लिए आपको मैन्युअल रूप से मैन्युअल रूप से बनाए गए ऑब्जेक्ट्स में मानों को भरना होगा या आप कुछ हैक्स कर रहे हैं। XML को पार्स करने और ऑब्जेक्ट बनाने जैसी ध्वनि? वैसे, हाँ :)

इस दिन केवल नवीनतम ब्राउज़रों JSON के लिए देशी समर्थन के साथ आते हैं। अधिक ब्राउज़रों का समर्थन करने के लिए आपके पास दो विकल्प हैं: ए) आप जावास्क्रिप्ट में एक जेसन पैराज़र लोड करते हैं जो आपको पार्सिंग में मदद करता है। तो, दृढ़ता से संबंधित यह आवाज कितनी मोटी है? जैसा कि मैं अक्सर देखता हूं दूसरा विकल्प eval है। ऑब्जेक्ट प्राप्त करने के लिए आप JSON स्ट्रिंग पर केवल eval() कर सकते हैं। लेकिन यह सुरक्षा समस्याओं का एक नया सेट पेश करता है। JSON निर्दिष्ट है इसलिए इसमें फ़ंक्शंस नहीं हो सकते हैं। यदि आप फ़ंक्शन के लिए ऑब्जेक्ट्स की जांच नहीं कर रहे हैं तो कोई आपको आसानी से कोड भेज सकता है जिसे निष्पादित किया जा रहा है।

तो यह आपके द्वारा और अधिक पसंद करने पर निर्भर हो सकता है: JSON या XML। सबसे बड़ा अंतर संभावित रूप से चीजों तक पहुंचने के तरीके है, चाहे यह स्क्रिप्ट टैग XMLHTTPRequest हो ... मैं इस पर निर्णय लेता हूं कि इसका क्या उपयोग करना है। मेरी राय में यदि ब्राउज़र में XPATH के लिए उचित समर्थन होगा तो मैं अक्सर XML का उपयोग करने का निर्णय लेता हूं। लेकिन फैशन जेसन की ओर निर्देशित है और जावास्क्रिप्ट में अतिरिक्त जेसन पार्सर्स लोड कर रहा है।

यदि आप तय नहीं कर सकते हैं और आपको पता है कि आपको वास्तव में कुछ शक्तिशाली की जरूरत है तो आपको YAML पर एक नज़र डालना होगा। इस विषय में अधिक अंतर्दृष्टि प्राप्त करने के लिए वाईएएमएल के बारे में पढ़ना बहुत दिलचस्प है। लेकिन यह वास्तव में इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

1

जेएसओएन एक टेक्स्ट-आधारित ऑब्जेक्ट सीरियलाइजेशन प्रारूप है जो एक्सएमएल से अधिक हल्का है और यह सीधे जावास्क्रिप्ट के ऑब्जेक्ट मॉडल के साथ एकीकृत करता है। वहीं इसके अधिकांश फायदे हैं।

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

5

यदि आप जावास्क्रिप्ट में काम कर रहे हैं, तो यह हमारे लिए JSON बहुत आसान है। ऐसा इसलिए है क्योंकि जेएसओएन का सीधे जावास्क्रिप्ट ऑब्जेक्ट में मूल्यांकन किया जा सकता है, जो डीओएम की तुलना में काम करना बहुत आसान है।

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1]; 
:

उधार और थोड़ा एक्सएमएल और से

XML: 

<person> 
    <name>John Doe</name> 
    <tag>friend</tag> 
    <tag>male</tag> 
</person> 

JSON: 

{ person: {"name": "John Doe", "tag": ["friend", "male"]} } 

ऊपर आप XML के साथ दूसरे टैग वस्तु प्राप्त करना चाहता था, तो JSON में फेरबदल, आप शक्तिशाली लेकिन वर्बोज़ डोम एपीआई का उपयोग करने की आवश्यकता होगी

एक जावास्क्रिप्ट वस्तु है कि JSON के माध्यम से में आया के साथ जबकि, आप बस इस्तेमाल कर सकते हैं:

var tag2=jsonObj.person.tag[1]; 

बेशक, jQuery के डोम उदाहरण बहुत सरल बनाता है:

var tag2=$("person tag",xmlObj).get(1); 

हालांकि, JSON बस "फिट" एक जावास्क्रिप्ट दुनिया में। यदि आप थोड़ी देर के लिए इसके साथ काम करते हैं, तो आप पाएंगे कि आपके पास XML आधारित डेटा को शामिल करने से बहुत कम मानसिक उपर है।

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

var tag2=(jsonObj.person && jsonObj.person.tags && jsonObj.person.tags.sort && jsonObj.person.tags.length==2 ? jsonObj.person.tags[1] : null); 

(कुछ लोग उस त्रिगुट की लंबी पसंद नहीं सकता है, लेकिन यह काम करता है): हालांकि, JSON के मूल सत्ता, jsonObj के साथ ऐसा करने वर्णन करने के लिए, आप बस करना होगा। लेकिन एक्सएमएल (मेरी राय में) नास्टियर (मुझे नहीं लगता कि आप टर्नरी दृष्टिकोण जाना चाहते हैं क्योंकि आप डोम विधियों को कॉल करना जारी रखेंगे जिन्हें कार्यान्वयन के आधार पर फिर से काम करना पड़ सकता है):

var tag2=null; 
var persons=xmlObj.getElementsByTagName("person"); 
if(persons.length==1) { 
    var tags=persons[0].getElementsByTagName("tag"); 
    if(tags.length==2) { tag2=tags[1]; } 
} 

Jquery (untested):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0); 
संबंधित मुद्दे