मैं "अननोन सिन्टैक्सेयर: अनपेक्षित टोकन ओ" प्राप्त करता रहता हूं


306

मैं कुछ html / css / जावास्क्रिप्ट सीखने की कोशिश कर रहा हूं, इसलिए मैं खुद को एक शिक्षण परियोजना लिख ​​रहा हूं।

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

ऐसा करने के बाद मुझे एक त्रुटि मिलनी शुरू हो गई थी, इसलिए मैंने अपने द्वारा लिखे गए सभी कोड को हटा दिया, मुझे केवल एक लाइन (वही लाइन जो पहले काम कर चुकी थी) को छोड़कर ... केवल त्रुटि अभी भी है।

त्रुटि इस प्रकार है:

Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback

मेरा जावास्क्रिप्ट कोड एक अलग फ़ाइल में समाहित है और बस यही है:

function loadPageIntoDiv(){
    document.getElementById("wokabWeeks").style.display = "block";
}

function loadWokab(){
    //also tried getJSON which threw the same error
    jQuery.get('wokab.json', function(data) {
        var glacier = JSON.parse(data);
    });
}

और मेरी JSON फाइल अभी निम्नलिखित अधिकार है:

[
    {
        "english": "bag",
        "kana": "kaban",
        "kanji": "K"
    },

    {
        "english": "glasses",
        "kana": "megane",
        "kanji": "M"
    }
]

अब लाइन 11 में त्रुटि बताई गई है जो var glacier = JSON.parse(data);लाइन है।

जब मैं json फ़ाइल निकालता हूं तो मुझे त्रुटि मिलती है: "GET http: //../wokab.json 404 (नहीं मिला)" तो मुझे पता है कि यह लोड हो रहा है (या कम से कम कोशिश कर रहा है)।


5
$ .get जब भेजा जाता है, तो उसे पहचान सकते हैं। var glacier = data;पर्याप्त होना चाहिए।
रोजेलन

46
सारांश: आप इसे दो बार पार्स करने की कोशिश कर रहे हैं।
फिएटजैफ

इसके अलावा stackoverflow.com/a/42907459/632951
Pacerier

मैं इसी तरह की मिल गया Uncaught SyntaxError: Unexpected token Iक्योंकि अजगर encodesjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
बॉब स्टीन

जवाबों:


314

ऐसा लगता है कि jQuery डेटाटाइप के बारे में अनुमान लगाता है। यह तब भी JSON को पार्स करता है, जब आप getJSON () को कॉल नहीं कर रहे हों - तब जब आप किसी ऑब्जेक्ट पर JSON.parse () को कॉल करने का प्रयास करते हैं, तो आपको त्रुटि मिल रही है।

आगे की व्याख्या आदित्य मित्तल के उत्तर में मिल सकती है ।


13
अहा, इसलिए डेटा [0]। सेंधमारी रिटर्न "बैग"। ऐसा लगता है कि मुझे json फ़ाइल को बिल्कुल भी पार्स नहीं करना है।
ब्योर्निन

1
यह दिलचस्प है .. मुझे लगता है कि jquery डेटाटाइप पर एक अनुमान लगाती है और मानती है कि यह json है। मुझे लगता है कि getJson तब भी काम करेगा, है ना?
15

87
छोटे नोट: यदि आप JSON.parseएक वस्तु "अप्रत्याशित टोकन ओ" को केवल इसलिए फेंक देते हैं क्योंकि यह पार्स करने की कोशिश करता है obj_to_parse.toString(), जो कि है [object Object]। कोशिश करो JSON.parse('[object Object]');;)
पियर पाओलो रेमन

22
यह मेरे साथ भी हुआ, मुझे लगता है कि मेरी त्रुटि यह थी कि मैंने JSON को पार्स करने की कोशिश की, जो पहले से ही JSON ऑब्जेक्ट था
Wak

2
jQuery का अनुमान नहीं है । यदि आप इसे dataTypeकिसी भी तरह से ओवरराइड नहीं करते हैं ( तो आप ऐसा क्यों करेंगे), तो यह Content-typeप्रतिक्रिया के HTTP हेडर का उपयोग करता है यह निर्धारित करने के लिए कि यह किस प्रकार का डेटा है, और इसे पार्स करता है यदि यह एक ऐसा है जो jQuery को पहचानता है।
क्वेंटिन

76

समस्या बहुत सरल है

jQuery.get('wokab.json', function(data) {
    var glacier = JSON.parse(data);
});

आप इसे दो बार पार्स कर रहे हैं। getका उपयोग करता है dataType='json', इसलिए डेटा पहले से ही json प्रारूप में है। $.ajax({ dataType: 'json' ...विशेष रूप से दिए गए डेटा प्रकार को सेट करने के लिए उपयोग करें !


54

मूल रूप से यदि प्रतिक्रिया हेडर टेक्स्ट / html है तो आपको पार्स करने की आवश्यकता है, और यदि प्रतिक्रिया हेडर एप्लीकेशन / जसन है तो यह आपके लिए पहले से ही पार्स है।

पाठ / HTML प्रतिक्रिया के लिए jquery सफलता हैंडलर से प्राप्त डेटा:

var parsed = JSON.parse(data);

आवेदन / json प्रतिक्रिया के लिए jquery सफलता हैंडलर से प्राप्त डेटा:

var parsed = data;

6
इसे नीचे मतदान करने वाले किसी भी व्यक्ति पर ध्यान दें, ऊपर दिए गए स्वीकृत उत्तर में इस उत्तर की सटीक प्रति शामिल है। अब स्वीकृत उत्तर से लिंक जोड़ना।
जियोफ्रे हेल

11

Unexpected tokenत्रुटियों के लिए एक और संकेत । जावास्क्रिप्ट ऑब्जेक्ट्स और json के बीच दो प्रमुख अंतर हैं:

  1. json डेटा को हमेशा दोहरे कोट्स के साथ उद्धृत किया जाना चाहिए।
  2. चाबियाँ उद्धृत की जानी चाहिए

JSON को ठीक करें

 {
    "english": "bag",
    "kana": "kaban",
    "kanji": "K"
}

त्रुटि JSON 1

 {
    'english': 'bag',
    'kana': 'kaban',
    'kanji': 'K'
 }

त्रुटि JSON 2

 {
    english: "bag",
    kana: "kaban",
    kanji: "K"
}

टिप्पणी

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


2

बस प्रतिक्रिया पहले से ही पार्स है, आपको इसे फिर से पार्स करने की आवश्यकता नहीं है। यदि आप इसे फिर से पार्स करते हैं तो यह आपको "अप्रत्याशित टोकन ओ" देगा, हालांकि आपको टाइप करने के लिए अपने अनुरोध में डेटाटाइप निर्दिष्ट करना होगाdataType='json'


1

मुझे अभी भी इसी तरह की समस्या थी और मेरे समाधान से मदद मिल सकती है। मैं एक xml फ़ाइल को json में अपलोड करने और उसे वापस भेजने और उसे पर्दे के पीछे भेजने के लिए एक iframe का उपयोग कर रहा हूं, और Chrome आने वाले डेटा में कुछ कचरा जोड़ रहा है जो केवल रुक-रुक कर दिखाई देगा और "अनटॉक्ड सिंटैक्सऑयोरम" का कारण होगा: अनपेक्षित टोकन ओ। त्रुटि।

मैं इस तरह से iframe डेटा एक्सेस कर रहा था:

$('#load-file-iframe').contents().text()

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

$('#load-file-iframe').contents().find('body').text()

एक बार जब मैंने HTML प्रतिक्रिया में कुछ कचरा देखा।

लंबी कहानी लघु आपके कच्चे HTML प्रतिक्रिया डेटा की जाँच करें और आप कुछ बदल सकते हैं।


ठीक है धन्यवाद। अजीब तरह से यह कभी-कभी पहले से ही पार्स किए गए जोंस ऑब्जेक्ट को प्राप्त करने के लिए लगता है और कभी-कभी नहीं। प्रोजेक्ट को जारी रखने के लिए मेरे पास समय नहीं है इसलिए मुझे नहीं पता कि यह यादृच्छिक रूप से ऐसा होगा (ब्राउज़र और सिस्टम या कुछ पर निर्भर करता है)। पॉइंटर के लिए धन्यवाद मैं इसे ध्यान में रखूंगा।
ब्योर्निन

1
SyntaxError: Unexpected token o in JSON

यह तब भी होता है जब आप awaitJSON डेटा लौटाने वाली विधि के लिए कीवर्ड का उपयोग करना भूल जाते हैं ।

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

async function returnJSONData()
{
   return "{\"prop\": 2}";
}

var json_str = returnJSONData();
var json_obj = JSON.parse(json_str);

गुम होने के कारण कोई त्रुटि करेगा await। वास्तव में जो लौटाया जाता है वह एक Promise[वस्तु] है, न किstring

जैसा कि आप करने के लिए माना जाता है कि बस इंतजार जोड़ने के लिए तय करने के लिए:

var json_str = await returnJSONData();

यह बहुत स्पष्ट होना चाहिए, लेकिन त्रुटि को कहा जाता है JSON.parse, इसलिए यह याद रखना आसान है कि क्या आपके विधि कॉल और कॉल के बीच कुछ दूरी हैawaitJSON.parse


0

सुनिश्चित करें कि आपकी JSON फ़ाइल में पहले या बाद में कोई अनुगामी वर्ण नहीं है। शायद एक अप्राप्य? आप इस तरह से कोशिश कर सकते हैं:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]

1
JSON.parse ( '[{ "अंग्रेज़ी": "बैग", "काना": "kaban", "कांजी": "K"}, { "अंग्रेज़ी": "चश्मा", "काना": "Megane" " कांजी ":" एम "}] '); ठीक काम करता है। Data क्या आपने उस लाइन को अलर्ट (डेटा) से बदलने की कोशिश की है कि क्या फ़ाइल सही लोड हो रही है?
thexebolud 14

0
const getCircularReplacer = () => {
              const seen = new WeakSet();
              return (key, value) => {
                if (typeof value === "object" && value !== null) {
                  if (seen.has(value)) {
                    return;
                  }
                  seen.add(value);
                }
                return value;
              };
            };
JSON.stringify(tempActivity, getCircularReplacer());

जहां tempActivity उस डेटा को फेल कर रही है जो "सिंटेक्सएरर: एरर को उत्पन्न करता है। स्थिति 1 में जोंसन में अप्रत्याशित टोकन ओ - स्टैक ओवरफ्लो"

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