jQuery AJAX क्वेरी से मेरे JSON को पार्स नहीं करेगा


88

मुझे jQuery.ajax () का उपयोग करके अपने सर्वर से लौटे कुछ JSON डेटा को पार्स करने में कठिनाई हो रही है

AJAX का उपयोग करने के लिए मैं उपयोग कर रहा हूं:

$.ajax({
  url: myUrl,
  cache: false,
  dataType: "json",
  success: function(data){
    ...
  },
  error: function(e, xhr){
    ...
  }
});  

और अगर मैं वस्तुओं की एक सरणी लौटाता हूं तो यह ठीक काम करता है:

[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]

सफलता समारोह कहा जाता है और सही वस्तु प्राप्त करता है।

हालाँकि, जब मैं किसी एक वस्तु को वापस करने की कोशिश कर रहा हूँ:

{ title: "One", key: "1" } 

त्रुटि फ़ंक्शन को कहा जाता है और xhr में 'पार्सररोर' होता है। मैंने तार को नीचे भेजने से पहले सर्वर पर JSON को कोष्ठक में लपेटने की कोशिश की है, लेकिन इससे कोई फर्क नहीं पड़ता। फिर भी अगर मैं सामग्री को जावास्क्रिप्ट में एक स्ट्रिंग में चिपकाता हूं और फिर eval () फ़ंक्शन का उपयोग करता हूं, तो यह पूरी तरह से मूल्यांकन करता है।

किसी भी विचार मैं गलत क्या कर रहा हूँ?

एंथोनी


जवाबों:


72

क्या आपका सर्वर सामग्री-प्रकार के रूप में डेटा भेज रहा है "*/json"? यदि नहीं, तो तदनुसार प्रतिक्रिया शीर्षकों को संशोधित करें। "application/json"उदाहरण के लिए, भेजना ठीक रहेगा।


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

51

Json.org विनिर्देश के अनुसार , आपका रिटर्न अमान्य है। नाम हमेशा उद्धृत किए जाते हैं, इसलिए आपको वापस लौट जाना चाहिए

{ "title": "One", "key": "1" }

तथा

[ { "title": "One", "key": "1" }, { "title": "Two", "key": "2" } ]

यह आपके सेटअप के साथ समस्या नहीं हो सकती है, क्योंकि आप कहते हैं कि उनमें से एक अब काम करता है, लेकिन इसे सही करने के लिए तय किया जाना चाहिए, अगर आपको भविष्य में किसी अन्य JSON पार्सर पर स्विच करने की आवश्यकता हो।


2
दरअसल, jQuery 1.4 में (उदाहरण के लिए) { key: 'val' }वैध JSON नहीं है।
rfunduk

34

JSON तार डबल कोट में लिपटे हैं ; एकल उद्धरण एक मान्य विकल्प नहीं हैं।

{"who": "Hello World"}

मान्य है लेकिन यह नहीं है ...

{'who': 'Hello World'}

जबकि ओपी का मुद्दा यह नहीं है कि यह उन अन्य लोगों के लिए ध्यान देने योग्य है जो यहां उतरते हैं।


30

यह समस्या आमतौर पर है क्योंकि आपके अनुरोध को गलत माइम प्रकार मिला है। अपने स्वयं के कंप्यूटर पर विकसित करते समय, कभी-कभी आपको "सर्वर" से उचित माइम प्रकार प्राप्त नहीं होता है, जो आपका खुद का कंप्यूटर है। ब्राउज़र में स्थानीय रूप से संग्रहीत फ़ाइल को खोलते समय विकसित होने पर मैं एक बार इस समस्या में चला गया था (उदाहरण के लिए url "c: /project/test.html")।

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

इस प्रश्न के अनुसार उचित माइम प्रकार अनुप्रयोग / json है , लेकिन मुझे पता है कि आवेदन / j-son ने तब काम किया जब मैंने इसे (अब कई साल पहले) आजमाया। आपको पहले आवेदन / जसन की कोशिश करनी चाहिए।

var jsonMimeType = "application/json;charset=UTF-8";
$.ajax({
 type: "GET",
 url: myURL,
 beforeSend: function(x) {
  if(x && x.overrideMimeType) {
   x.overrideMimeType(jsonMimeType);
  }
 },
 dataType: "json",
 success: function(data){
  // do stuff...
 }
});

बस कहना है कि पहले सुझाव आप सुझाव मेरे लिए काम किया है !! मेरे अजाक्स कॉल ने सफारी और क्रोम में बहुत काम किया लेकिन फायरफॉक्स नहीं। जैसे ही मैंने पहले वाला ऐड डाला तो फ़ायरफ़ॉक्स ने राइट ऑफ कर दिया। वाह!! धन्यवाद!!
कर्मेन ब्लेक

7

मेरे पास यह मुद्दा था और थोड़ा मैंने इस्तेमाल किया

eval('('+data+')')

किसी ऑब्जेक्ट में डेटा वापस पाने के लिए। लेकिन बाद में अन्य मुद्दों पर 'अभिभावक' में 'लापता' होने की त्रुटि थी और पता चला कि jQuery के पास विशेष रूप से एक json संरचना के लिए एक स्ट्रिंग का मूल्यांकन करने के लिए एक फ़ंक्शन है:

$.parseJSON(data)

चाल चलनी चाहिए। यह पाठ्यक्रम के उचित प्रारूप में आपके जॉगन स्ट्रिंग होने के अलावा है।


6

यदि आप json प्रतिक्रिया को प्रतिध्वनित कर रहे हैं और आपके हेडर * / json से मेल नहीं खाते हैं तो आप प्रतिक्रिया को पार्स करने के लिए बिल्ट इन jQuery.parseJSON api का उपयोग कर सकते हैं।

response = '{"name":"John"}';
var obj = jQuery.parseJSON(response);
alert( obj.name === "John" );

4
{ title: "One", key: "1" }

क्या आप क्या सोचते हैं। एक अभिव्यक्ति के रूप में, यह एक वस्तु शाब्दिक है, लेकिन एक बयान के रूप में, यह है:

{                // new block
    title:       // define a label called 'title' for goto statements
        "One",   // statement: the start of an expression which will be ignored
        key:     // ...er, what? you can't have a goto label in the middle of an expression
                 // ERROR

दुर्भाग्य से eval () आपको यह निर्दिष्ट करने का कोई तरीका नहीं देता है कि क्या आप इसे एक बयान या एक अभिव्यक्ति दे रहे हैं, और यह गलत अनुमान लगाता है।

सामान्य समाधान वास्तव में इसे () समारोह में भेजने से पहले कोष्ठक में कुछ भी लपेटना है । आप कहते हैं कि आपने कोशिश की है कि सर्वर पर ... स्पष्ट रूप से किसी भी तरह से नहीं मिल रहा है। जो ग्राहक XMLHttpRequest प्रतिसाद प्राप्त कर रहा है, उस पर यह कहने के लिए वाटरप्रूफ होना चाहिए:

eval('('+responseText+')');

के बजाय:

eval(responseText);

जब तक प्रतिक्रिया वास्तव में एक अभिव्यक्ति है एक बयान नहीं है। (उदा। इसमें एकाधिक, अर्धविराम या -न्यूलाइन-अलग-अलग खंड नहीं हैं।


मुझे लगता है कि अनुरोध डेटा को संसाधित करते समय jQuery अपने आप कोष्ठक जोड़ता है।
प्रातः 28:30

2
यह उत्तर मेरे लिए बहुत उपयोगी था, क्योंकि मैंने कभी नहीं समझा कि लोग जेन्सन को कोष्ठक में क्यों लपेटते हैं।
एंड्री टारनटोसोव

3

आपको अपनी php में हेडर कंटेंट टाइप को इस तरह सेट करना होगा:

 <?php

 header('Content-type:application/json');

 ?>

बेहतर समझने के लिए देखें ये वीडियो…।

संदर्भ: http://www.youtube.com/watch?v=EvFXWqEqh6o


2

यदि आप jQuery का उपयोग करके ASP.NET वेब सेवाओं का उपभोग कर रहे हैं, तो सुनिश्चित करें कि आप अपने web.config में निम्न शामिल हैं:

<webServices>
    <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
    </protocols>
</webServices>

2

मुझे इससे एक समान समस्या थी जहाँ फ़ायरफ़ॉक्स 3.5 ने ठीक काम किया और मेरे JSON डेटा को पार्स किया लेकिन फ़ायरफ़ॉक्स 3.0.6 ने एक पार्सर लौटा दिया। यह पता चला कि यह JSON की शुरुआत में एक खाली जगह थी जिसने फ़ायरफ़ॉक्स 3.0.6 को एक त्रुटि फेंक दिया था। खाली जगह को हटाकर इसे ठीक किया


2

तकनीक "eval ()" और "JSON.parse ()" पारस्परिक रूप से अनन्य स्वरूपों का उपयोग करते हैं।

  • "Eval ()" कोष्ठक के साथ आवश्यक हैं
  • "JSON.parse ()" कोष्ठक के साथ निषिद्ध हैं

खबरदार, "निष्कासन" (प्रारूप) "फ़ंक्शंस" का निर्माण करते हैं। अजाक्स के लिए, आपको केवल JSON प्रारूप का उपयोग करना चाहिए।

जबकि "eval" संपूर्ण जावास्क्रिप्ट भाषा को शामिल करता है, JSON भाषा का केवल एक छोटा सा उपसमूह उपयोग करता है। जावास्क्रिप्ट भाषा में निर्माणों के बीच "eval" को पहचानना होगा "ब्लॉक स्टेटमेंट" (उर्फ "कंपाउंड स्टेटमेंट") ; जो एक जोड़ी है या घुंघराले ब्रेसिज़ "{}" के साथ कुछ कथन अंदर हैं। लेकिन घुंघराले ब्रेसिज़ का उपयोग ऑब्जेक्ट लिटरल के सिंटैक्स में भी किया जाता है। व्याख्या उस संदर्भ से भिन्न होती है जिसमें कोड दिखाई देता है। कुछ आपको वस्तु शाब्दिक लग सकता है, लेकिन "स्पष्ट" इसे एक यौगिक कथन के रूप में देखेंगे।

जावास्क्रिप्ट भाषा में, ऑब्जेक्ट शाब्दिक एक असाइनमेंट के दाईं ओर होते हैं।

var myObj = { ...some..code..here... };

ऑब्जेक्ट शाब्दिक अपने आप नहीं होते हैं।

{ ...some..code..here... }   // this looks like a compound statement

ओपी के मूल प्रश्न पर वापस जाते हुए, 2008 में पूछा गया, उन्होंने पूछताछ की कि निम्नलिखित "निष्कासन ()" में विफल क्यों हैं:

{ title: "One", key: "1" }

इसका उत्तर यह है कि यह एक यौगिक कथन जैसा दिखता है। इसे एक वस्तु में बदलने के लिए, आपको इसे एक ऐसे संदर्भ में रखना होगा जहां एक यौगिक कथन असंभव है। यह चारों ओर कोष्ठक लगाकर किया जाता है

( { title: "One", key: "1" } )    // not a compound statment, so must be object literal

ओपी ने यह भी पूछा कि इसी तरह के एक बयान ने सफलतापूर्वक क्यों निकाला:

[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]

एक ही उत्तर लागू होता है - घुंघराले ब्रेसिज़ एक संदर्भ में होते हैं जहां एक यौगिक कथन असंभव है। यह एक सरणी संदर्भ है, " [...]", और सरणियों में ऑब्जेक्ट्स हो सकते हैं, लेकिन उनमें कथन नहीं हो सकते।

"Eval ()" के विपरीत, JSON अपनी क्षमताओं में बहुत सीमित है। सीमा जानबूझकर है। JSON के डिजाइनर ने केवल सिंटैक्स का उपयोग करके जावास्क्रिप्ट के एक न्यूनतम उपसमुच्चय का इरादा किया, जो एक असाइनमेंट के दाहिने हाथ की तरफ दिखाई दे सकता है। तो अगर आपके पास कुछ कोड है जो JSON में सही ढंग से पार्स करता है ...

var myVar = JSON.parse("...some...code...here...");

... इसका तात्पर्य यह है कि यह किसी कार्य के दायीं ओर कानूनी रूप से पार्स होगा, इस तरह ।।

var myVar = ...some..code..here... ;

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

इन सीमाओं के कारण, JSON का कोष्ठक के लिए कोई उपयोग नहीं है। नतीजतन, JSON स्ट्रिंग में एक कोष्ठक एक अवैध चरित्र है।

निम्नलिखित कारणों से हमेशा JSON प्रारूप का उपयोग करें

  • JSON के लिए एक विशिष्ट अजाक्स पाइपलाइन को कॉन्फ़िगर किया जाएगा।
  • एक सुरक्षा जोखिम के रूप में "eval ()" के उपयोग की आलोचना की जाएगी।

एक अजाक्स पाइपलाइन के उदाहरण के रूप में, एक प्रोग्राम पर विचार करें जिसमें एक नोड सर्वर और एक jQuery क्लाइंट शामिल है। क्लाइंट प्रोग्राम फॉर्म वाले jQuery कॉल का उपयोग करता है $.ajax({dataType:'json',...etc.});। JQuery बाद में उपयोग के लिए एक jqXHR ऑब्जेक्ट बनाता है, फिर पैकेज और संबंधित अनुरोध भेजता है। सर्वर अनुरोध को स्वीकार करता है, इसे संसाधित करता है, और फिर प्रतिक्रिया देने के लिए तैयार होता है। सर्वर प्रोग्राम res.json(data)पैकेज को विधि को कॉल करेगा और प्रतिक्रिया भेजेगा। क्लाइंट की तरफ वापस, jQuery प्रतिक्रिया को स्वीकार करता है, संबंधित jXXHR ऑब्जेक्ट को सुरक्षित करता है, और JSON स्वरूपित डेटा को संसाधित करता है। यह सब मैन्युअल डेटा रूपांतरण की आवश्यकता के बिना काम करता है। प्रतिक्रिया में नोड सर्वर पर JSON.stringify () और क्लाइंट पर JSON.parse () के लिए कोई स्पष्ट कॉल शामिल नहीं है; यह सब आपके लिए है।

"Eval" का उपयोग कोड इंजेक्शन सुरक्षा जोखिमों के साथ जुड़ा हुआ है। आप सोच सकते हैं कि ऐसा कोई तरीका नहीं है जो हो सकता है, लेकिन हैकर्स काफी रचनात्मक हो सकते हैं। इसके अलावा, "eval" जावास्क्रिप्ट अनुकूलन के लिए समस्याग्रस्त है।

यदि आप एक "स्ट्रिफ़ाइज़र ()" फ़ंक्शन का उपयोग करके खुद को पाते हैं, तो ध्यान रखें कि उस नाम के साथ कुछ फ़ंक्शन स्ट्रिंग्स बनाएंगे जो "eval" के साथ संगत हैं और JSON के साथ नहीं। उदाहरण के लिए, नोड में, निम्नलिखित आपको फ़ंक्शन देता है जो "इवैल" संगत प्रारूप में तार बनाता है:

var stringify = require('node-stringify'); // generates eval() format

यह उपयोगी हो सकता है, लेकिन जब तक आपको कोई विशिष्ट आवश्यकता नहीं होती है, यह संभवतः वह नहीं है जो आप चाहते हैं।


1

यदि कोई सरणी काम करता है और एक एकल ऑब्जेक्ट वापस करता है, तो आप अपने एकल ऑब्जेक्ट को उस एकल ऑब्जेक्ट वाले सरणी के रूप में वापस करने की कोशिश भी कर सकते हैं:

[ { title: "One", key: "1" } ]

इस तरह आप एक निरंतर डेटा संरचना, ऑब्जेक्ट्स की एक सरणी, डेटा पेलोड से कोई फर्क नहीं पड़ रहे हैं।

मुझे लगता है कि आपने "कोष्ठक" में अपनी एकल वस्तु को लपेटने की कोशिश की है, और उदाहरण के साथ यह सुझाव दें क्योंकि जावास्क्रिप्ट व्यवहार करता है [..] से अलग (..)


1

यदि jQuery के त्रुटि हैंडलर को बुलाया जा रहा है और XHR ऑब्जेक्ट में "पार्सर त्रुटि" है, तो संभवतः सर्वर से वापस आने वाली एक Parser त्रुटि है।

जब आप एक पैरामीटर के बिना सेवा को कॉल करते हैं, तो क्या आपका एकाधिक परिणाम होता है, लेकिन जब आप एकल रिकॉर्ड प्राप्त करने के लिए पैरामीटर की आपूर्ति करने का प्रयास करते हैं तो यह टूट जाता है?

आप किस बैकेंड से यह लौटा रहे हैं?

ASMX सेवाओं पर, उदाहरण के लिए, अक्सर ऐसा होता है जब पैरामीटर JSON स्ट्रिंग के बजाय JSON ऑब्जेक्ट के रूप में jQuery को दिए जाते हैं। यदि आप jQuery को इसके "डेटा" पैरामीटर के लिए एक वास्तविक JSON ऑब्जेक्ट प्रदान करते हैं, तो यह JSON के रूप में भेजने के बजाय मानक और सीमांकित k, v जोड़े में अनुक्रमित करेगा।


1

मैंने अपने कुछ कार्यान्वयन में पाया जो मुझे जोड़ना था:

obj = new Object; obj = (data.obj);

जो समस्या को हल करने के लिए लग रहा था। ईवल या नहीं यह मेरे लिए बिल्कुल ऐसा ही लग रहा था।


ऑब्जेक्ट का शाब्दिक उपयोग करें जब एक नया ऑब्जेक्ट इनिशियलाइज़ कर रहा है, ऑब्जेक्ट कंस्ट्रक्टर नहीं: var obj = {};
एंड्रियास ग्रीच

हाँ मैं देख रहा हूँ, var myArray = [] सरणियों और var myObject = {} के लिए, टिप के लिए धन्यवाद Dreas
Jay

1

jQuery के JSON कुंजी पर चुटकुले। मैं इस JSON स्निपेट को PHP में भेज रहा था:

echo json_encode((object) array('result' => 'success'));

कुछ और काम करने के लिए 'परिणाम' कुंजी का नाम बदलना। मुझे लगता है कि यह किसी प्रकार का आरक्षित शब्द टकराव है, और jQuery (1.4.2) में एक बग हो सकता है।


1

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


1

यह भी कोशिश करो

$.ajax({
    url: url,
    data:datas,
    success:function(datas, textStatus, jqXHR){
    var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{')));
})};

मेरे मामले में सर्वर '{' से पहले अनजाने चरित्र के साथ प्रतिक्रिया करता है


1

मुझे स्टेटस = पार्सेरोर और xhr.status = 200 मिल रहा था।

मेरे लिए मुद्दा यह था कि URL की JSON प्रतिक्रिया के अंदर '\' का स्विचिंग '/' तय था।


0

मैं इसके साथ संघर्ष कर रहा था, और कुछ घंटों तक यह पता लगाने की कोशिश की, जब तक कि मैंने डेटा ऑब्जेक्ट दिखाने के लिए फायरबग का उपयोग नहीं किया।

var data = eval("(" + data.responseText + ")");
console.log(data.count);

-1

उपयोग

$data = yourarray(); 
json_encode($data)

सर्वर की तरफ। क्लाइंट की ओर से डेटाटाइप JSON के साथ ajax का उपयोग करें और सुनिश्चित करें कि आपका दस्तावेज़ एन्कोडिंग UTF-8 नहीं है BOM के साथ इसे UTF-8 होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.