2013-10-08 13 views
39

मुझे जेएसओएन वेब सेवा से वापस आने में परेशानी हो रही है। ऐसा लगता है कि JSON में उद्धरण की कमी है, लेकिन जब मैं JSON को उद्धरण जोड़ता हूं, तो मुझे एक त्रुटि मिलती है। यहां त्रुटि संदेश है: 'अनकही सिंटेक्स त्रुटि: अप्रत्याशित टोकन ओ। जब मैं स्ट्रिंग सांत्वना देने के लिए लॉग इन:JSON.Parse, 'Uncaught SyntaxError: अप्रत्याशित टोकन ओ

//Error I am trying to solve 
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'; 
var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var $grouplist = $('#groups'); 
    $.each(myData, function() { 
     $('<li>' + this.Name + '</li>').appendTo($grouplist); 
    }); 
}); 

यहाँ स्ट्रिंग के आसपास एकल उद्धरण के साथ एक ही कोड है:

यहाँ [वस्तु वस्तु], [वस्तु वस्तु] कुछ उदाहरण कोड है कि त्रुटि simulates है । यह

//Successful Javascript 
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'; 
var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var $grouplist = $('#groups'); 
    $.each(myData, function() { 
     $('<li>' + this.Name + '</li>').appendTo($grouplist); 
    }); 
}); 

//Successful HTML 
<ul id="groups"></ul> 

काम करता है लेकिन जब मैं स्ट्रिंग के लिए उद्धरण को जोड़ने के लिए, की तरह मैं अपने वास्तविक कोड में करने की जरूरत है लगता है की कोशिश है, यह विफल रहता है: करने के लिए लॉग स्ट्रिंग:

//Does not work when I need to append quotes to the string: 
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 
jsonStringQuotes = "'" + jsonStringNoQuotes + "'"; 
var myData = JSON.parse(jsonStringQuotes); 

$(document).ready(function() { 
    var $grouplist = $('#groups'); 
    $.each(myData, function() { 
     $('<li>' + this.Name + ',' + this.Id + '</li>').appendTo($grouplist); 
    }); 
}); 

यहाँ त्रुटि है कंसोल: [ऑब्जेक्ट ऑब्जेक्ट], [ऑब्जेक्ट ऑब्जेक्ट] डेटा.जेएस: 80 9 अनकॉट सिंटेक्स त्रुटि: अप्रत्याशित टोकन '

मैं स्टंप हो गया हूं। किसी भी मदद की सराहना की! धन्यवाद!

+0

Jaon पार्स ले स्ट्रिंग पैरामीटर –

+0

के रूप में इन कोड के टुकड़े निश्चित रूप से कोई त्रुटि उत्पन्न है, लेकिन मुझे लगता है कि आप गलत बात पर देख रहे हैं। क्या आप उस कोड को पोस्ट कर सकते हैं जो सर्वर से JSON स्ट्रिंग पुनर्प्राप्त करता है? –

+0

आपका पहला कोड उदाहरण समस्या का अनुकरण नहीं करता है। आप किसके बारे में पूछ रहे हैं। आपका आखिरी वाला निश्चित रूप से गलत है। – user2736012

उत्तर

64

इसके चारों ओर एकल उद्धरण के बिना, आप इसके अंदर दो वस्तुओं के साथ एक सरणी बना रहे हैं। यह जावास्क्रिप्ट का अपना वाक्यविन्यास है। जब आप उद्धरण जोड़ते हैं, तो उस ऑब्जेक्ट (सरणी + 2 ऑब्जेक्ट्स) अब एक स्ट्रिंग है। एक स्ट्रिंग को जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करने के लिए आप JSON.parse का उपयोग कर सकते हैं। जावास्क्रिप्ट ऑब्जेक्ट को जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करने के लिए आप JSON.parse का उपयोग नहीं कर सकते।

//String - you can use JSON.parse on it 
var jsonStringNoQuotes = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'; 

//Already a javascript object - you cannot use JSON.parse on it 
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 

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

console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'"); 
//Logs: 
'[object Object],[object Object]' 

आप देखना होगा कि यह रिटर्न सरणी है, जो एक अल्पविराम पृथक सूची में परिवर्तित हो जाता की स्ट्रिंग प्रतिनिधित्व, और प्रत्येक सूची आइटम एक की स्ट्रिंग प्रतिनिधित्व किया जाएगा ऑब्जेक्ट, जो [object Object] है। याद रखें, जावास्क्रिप्ट में सहयोगी सरणी केवल प्रत्येक कुंजी/मूल्य जोड़ी के साथ संपत्ति/मूल्य होने वाली वस्तुएं होती हैं।

ऐसा क्यों होता है? चूंकि आप स्ट्रिंग "'" से शुरू कर रहे हैं, तो आप उस सरणी को जोड़ने की कोशिश कर रहे हैं, जो इसके स्ट्रिंग प्रस्तुति का अनुरोध करता है, फिर आप एक और स्ट्रिंग "'" जोड़ रहे हैं।

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

इस बेला देखें: http://jsfiddle.net/NrnK5/

+0

का उपयोग कर इसे देख सकते हैं मैं घंटों के लिए इसी समस्या पर काम कर रहा हूं। जानकारी के लिए धन्यवाद। –

+1

मुझे अपने JSON स्ट्रिंग में सिंगल कोट्स जोड़ने में कोई मोटा समय था क्योंकि यह डेटा विशेषता में था। मैंने JSON.parse करने से पहले JSON.stringify करके इसे हल किया। – arrow

+0

यहां लोगों के समान ही, मैंने वहां एक घंटे घूमते हुए बर्बाद कर दिया और अंत में यह सरल, स्पष्ट स्पष्टीकरण पाया, धन्यवाद! –

1

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

विनिर्देशों के लिए http://www.json.org/ देखें।

जोड़ना चाहिए: आपको ऐसा क्यों लगता है: "जैसे मुझे अपने असली कोड में आवश्यकता है"? तो शायद हम समाधान के साथ आने में आपकी मदद कर सकते हैं।

2
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 

यह जेसन ऑब्जेक्ट बनाएगा। पार्स करने की कोई ज़रूरत नहीं है।

jsonStringQuotes = "'" + jsonStringNoQuotes + "'"; 

कारण है कि यह (नीचे) त्रुटि पैदा वापस आ जाएगी '[वस्तु]'

thats

var myData = JSON.parse(jsonStringQuotes); 
+1

मुझे नहीं लगता कि रैपिंग सरणी एकल कोट्स में आपको उस सरणी का स्ट्रिंग अक्षर देगा। यह आपको कुछ '' [ऑब्जेक्ट], [ऑब्जेक्ट] 'जैसा कुछ देगा, जो स्पष्ट रूप से पार्स करने का कोई मतलब नहीं है। 'JSON.stringify' का प्रयोग करें। – volpav

+0

जो मैं कह रहा हूं .. कृपया मेरा उत्तर दोबारा पढ़ें –

+0

क्षमा करें, मुझे "कोई ज़रूरत नहीं है" (सुबह की सुबह) में "नहीं" याद आया। आपको शायद '' [ऑब्जेक्ट] 'आउटपुट को सही करना चाहिए, हालांकि यह नहीं है कि इस विशेष सरणी का प्रतिनिधित्व कैसे किया जाता है (पैडेंटिक होने के लिए खेद है, लेकिन अगर आप जो लिखते हैं, तो यह आपके समाधान को समझने में आसान बनाता है, वास्तव में वे क्या करते हैं खुद को खोज सकते हैं)। – volpav

1

हो सकता है कि क्या सर्वर पहले से ही JSON ऑब्जेक्ट के रूप मूल्यांकन किया जाता है से आता है? उदाहरण के लिए, jQuery get विधि का उपयोग कर:

$.get('/service', function(data) { 
    var obj = data; 

     /* 
     "obj" is evaluated at this point if server responded 
     with "application/json" or similar. 
     */ 
     for (var i = 0; i < obj.length; i++) { 
     console.log(obj[i].Name); 
     } 
    }); 

वैकल्पिक रूप से, अगर आप JSON स्ट्रिंग में JSON ऑब्जेक्ट चालू करने के लिए शाब्दिक की जरूरत है, आप JSON.stringify उपयोग कर सकते हैं:

var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 
var jsonString = JSON.stringify(json); 

लेकिन इस मामले में मैं क्यों समझ में नहीं आता आप json वैरिएबल नहीं ले सकते हैं और इसे स्ट्रिंग और पार्सिंग के बजाय संदर्भित कर सकते हैं।

+0

@ user3754676 आपका JSON मान्य नहीं हो सकता है (उदाहरण के लिए, डबल कोट्स गुम हैं)। आप http://jsonlint.com – volpav

संबंधित मुद्दे