बिना पढ़ा हुआ वाक्यविन्यास: JSON.parse के साथ अप्रत्याशित टोकन


190

तीसरी पंक्ति में इस त्रुटि का क्या कारण है?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

त्रुटि देखने के लिए कंसोल खोलें


16
आपके पास कोई JSON नहीं है? यह एक सरणी / वस्तु शाब्दिक है।
बरगी

जवाबों:


220

productsएक वस्तु है। (एक वस्तु शाब्दिक से बनाना)

JSON.parse()JSON नोटेशन वाली स्ट्रिंग को जावास्क्रिप्ट ऑब्जेक्ट में बदलने के लिए उपयोग किया जाता है ।

आपका कोड .toString()JSON पाठ के रूप में पार्स करने का प्रयास करने के लिए (कॉल करके ) ऑब्जेक्ट को स्ट्रिंग में बदल देता है ।
डिफ़ॉल्ट .toString()रिटर्न "[object Object]", जो वैध JSON नहीं है; इसलिए त्रुटि।


1
क्या यह एक ऐरे नहीं है? यह एक वस्तु क्यों है? ऑब्जेक्ट {से शुरू होते हैं और एरे से शुरू होते हैं [? या मैं यहाँ झूठा हूँ

4
सरणी वस्तुएं हैं; यह वही है जो .toString()रिटर्न (कल्पना के अनुसार) है।
SLAKs

1
क्या पहले वस्तु को कठोर करने का उपाय है?
मोहम्मद नौरेलिन 23

6
@ मोहम्मदमौरेलिन: नहीं; समाधान कुछ नहीं करना है और अपनी वस्तु का उपयोग करना है।
SLaks

1
क्या होगा यदि मुझे अजाक्स का उपयोग करके एक दूरस्थ सेवा से अपना डेटा मिलता है, जो मुझे जसन की प्रतिक्रिया देता है? और मैं चाहता हूं कि यह प्रतिक्रिया जावास्क्रिप्ट सरणी ऑब्जेक्ट में सहेजी जाए?
मोहम्मद नौरेलिन

126

मान लीजिए कि आपको पता है कि यह वैध JSON है, लेकिन आपके पास अभी भी यह हो रहा है ...

उस स्थिति में यह संभावना है कि आपके द्वारा जो भी स्रोत मिल रहा है उसमें स्ट्रिंग में छिपे / विशेष वर्ण हैं। जब आप सत्यापनकर्ता में पेस्ट करते हैं, तो वे खो जाते हैं - लेकिन स्ट्रिंग में वे अभी भी हैं। अदृश्य होते हुए वे वर्ण टूट जाएंगेJSON.parse()

यदि sआपका कच्चा JSON है, तो इसे साफ करें:

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);

मुझे त्रुटि मिल रही थी और मैंने इसे एक स्ट्रिंग में एक अजीब चरित्र के लिए नीचे ट्रैक किया। मैंने गैर वैध JSON वर्णों को हटाने की आपकी विधि का उपयोग किया और यह काम किया।
एलबर्ट्स्की

1
अब दो बार यहां आए हैं। thnx
बेंजामिन हॉफमैन

Base64 डिकोडिंग के बाद एक अनुगामी विशेष चरित्र मिला, आपकी विधि ने मुझे बहुत मदद की! Thx
Guillaume

अमान्य JSON के साथ प्रतिक्रिया करने वाले स्रोत पर विश्वास न करें। बस उन्हें सूचित करें कि डेटा दूषित है। उन्हें इसे ठीक करना चाहिए। यदि आप इस तरह या इसी तरह की प्रतिक्रिया को "पुनर्प्राप्त" करने का प्रयास करते हैं, तो आप एक अस्थिर संचार रखेंगे।
ओनूर येल्ड्रिम

सभी नियंत्रण वर्णों को बदलने के लिए s = s.replace(/[\u0000-\u001F]+/g,""); इसके बजाय होना चाहिए s = s.replace(/[\u0000-\u0019]+/g,""); । सही?
होंगचाओहांग

63

ऐसा लगता है कि आप ऑब्जेक्ट को सख्त करना चाहते हैं । तो ऐसा करें:

JSON.stringify(products);

त्रुटि का कारण यह है कि JSON.parse()एक Stringमूल्य की उम्मीद है और productsएक है Array

नोट: मुझे लगता है कि यह प्रयास करता है json.parse('[object Array]')जो शिकायत करता है कि इसके oबाद टोकन की उम्मीद नहीं थी [


28

मैं एक ही मुद्दे के साथ पाया JSON.parse(inputString)

मेरे मामले में इनपुट स्ट्रिंग मेरे सर्वर पेज [एक पेज विधि की वापसी] से आ रही है ।

मैंने मुद्रित किया typeof(inputString)- यह स्ट्रिंग था, अभी भी त्रुटि होती है।

मैंने भी कोशिश की JSON.stringify(inputString), लेकिन कोई फायदा नहीं हुआ।

बाद में मैंने इसे नए लाइन ऑपरेटर के साथ [\n]एक फील्ड वैल्यू के अंदर एक मुद्दा पाया ।

मैंने एक प्रतिस्थापित किया [कुछ अन्य चरित्र के साथ, पार्स के बाद नई लाइन वापस डाल दी] और सब कुछ ठीक काम कर रहा है।


2
नई लाइन का चरित्र भी मेरी समस्या थी। तो हम ऐसे डेटा को कैसे पुनर्स्थापित कर सकते हैं?
२०:३५ पर kolenda

@kolenda आपके पास JSON अमान्य है। आपको एक वास्तविक JSON धारावाहिक का उपयोग करने के लिए अपने सर्वर को बदलने की आवश्यकता है जो वैध JSON देता है।
SLAKs

मेरे पास एक समान मुद्दा था, लेकिन "\ n" के बजाय मेरे पास एक पथ के अंदर "\ e" था (मैंने "\" के बजाय "/" का उपयोग करने के लिए सर्वर साइड कोड बदल दिया और सब कुछ फिर से काम कर रहा था)
एडम टैल

एक भागने का उपयोग करें जिसमें \ n होगा \\ n
पॉल ग्रीगोइरे

13

JSON.parse पैरामीटर में स्ट्रिंग का इंतजार कर रहा है। समस्या को हल करने के लिए आपको अपनी JSON ऑब्जेक्ट को सख्त करना होगा।

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

12
products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

में बदलो

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';

2
@ एसएलएक्स यप, ओपी सीधे उत्पादों का उपयोग कर सकते हैं। लेकिन अगर वह उपयोग करना चाहता है JSON.parse, तो आर्गन्स को एक स्ट्रिंग होना चाहिए।
पक्तिंग्यू

मुझे एएसपी क्लासिक में क्या करना चाहिए क्योंकि 'टिप्पणी है
आशीष भट्ट

1
@ आशीषभट्ट आप उपयोग कर सकते हैं ", फिर अन्य सभी को" to \ "
बदलें

2
कुछ इस तरहJSON.parse(products.replace(/'/g, '"'))
केमिकल प्रोग्रामर

11

आपको अपने JSON स्ट्रिंग को यहाँ मान्य करना चाहिए ।

मान्य JSON स्ट्रिंग में कुंजियों के आसपास दोहरे उद्धरण चिह्न होने चाहिए:

JSON.parse({"u1":1000,"u2":1100})       // will be ok

यदि कोई उद्धरण नहीं है, तो यह एक त्रुटि का कारण होगा:

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

एकल उद्धरण का उपयोग करने से भी त्रुटि होगी:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

मेरे मामले में, ग्रिल्स 2.5.6 render ([key: value])एकल कोट्स के साथ प्रस्तुत किया गया, जिससे जेकेसी पार्सइर्रर के साथ 1 एक्शन में एक्सीलेंस अजैक हो गया। render (groovy.json.JsonOutput.toJson ([key:value]))मेरी मदद की।
दार्शनिक


3
[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

यहाँ आपका सही Json है जिसे आप पार्स कर सकते हैं।


3

यहां एक फ़ंक्शन है जिसे मैंने पिछले उत्तरों के आधार पर बनाया है: यह मेरी मशीन पर काम करता है लेकिन वाईएमएमवी।

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              ///programming/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.push(JSON.parse(element));
              }, this);

              return result;
            }

2

एक और गोचर जो "SyntaxError: Unexpected token"अपवाद में परिणाम कर सकता है जब कॉलिंग JSON.parse()स्ट्रिंग मानों में से किसी एक का उपयोग कर रही है:

  1. नई लाइन के पात्र।

  2. टैब (हाँ, टैब जो आप टैब कुंजी के साथ उत्पादन कर सकते हैं!)

  3. कोई भी स्टैंड-अलोन स्लैश \(लेकिन किसी कारण से /, कम से कम क्रोम पर नहीं।)

(पूरी सूची के लिए स्ट्रिंग खंड यहाँ देखें ।)

उदाहरण के लिए निम्नलिखित आपको यह अपवाद मिलेगा:

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

तो इसे बदल दिया जाना चाहिए:

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

जो, मुझे कहना चाहिए, यह केवल पाठ की बड़ी मात्रा के साथ JSON- केवल प्रारूप में काफी अपठनीय है।



1

उम्मीद है कि यह किसी और की मदद करता है।

मेरा मुद्दा यह था कि मैंने AJAX के माध्यम से PHP कॉलबैक फ़ंक्शन में HTML टिप्पणी की थी जो टिप्पणियों को पार्स कर रहा था और अमान्य JSON को लौटाता था।

एक बार जब मैंने टिप्पणी की गई HTML को हटा दिया, तो सब अच्छा था और JSON को कोई समस्या नहीं थी।


0

उत्पाद एक सरणी है जिसका उपयोग सीधे किया जा सकता है:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);

0

अब जाहिरा तौर पर \r, \b, \t, \f, आदि केवल समस्याग्रस्त वर्ण कि आपको यह त्रुटि दे सकते हैं नहीं कर रहे हैं।

ध्यान दें कि कुछ ब्राउज़रों के इनपुट के लिए अतिरिक्त आवश्यकताएं हो सकती हैं JSON.parse

इस परीक्षण कोड को अपने ब्राउज़र पर चलाएँ:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

क्रोम पर परीक्षण, मैं देखता हूं कि यह अनुमति नहीं है कि 34, 92 या 0 से 31 तक JSON.parse(String.fromCharCode(0x22, x, 0x22));कहां xहै।

वर्ण 34 और 92 हैं "और \क्रमश: वर्ण, और वे आम तौर पर उम्मीद कर रहे हैं और ठीक से फरार हो गए। यह 0 से 31 का चार्ट है जो आपको समस्याएं देगा।

डिबगिंग में मदद करने के लिए, इससे पहले कि आप यह JSON.parse(input)सत्यापित करें कि इनपुट में समस्याग्रस्त वर्ण नहीं हैं:

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}

0

आपको JSON.parse की आवश्यकता क्यों है? यह पहले से ही ऑब्जेक्ट स्वरूप में है।

नीचे के रूप में बेहतर JSON.stringify का उपयोग करें: var b = JSON.stringify(products);

यह आपकी मदद कर सकता है।


0

अरे यार, ऊपर दिए गए सभी जवाबों में समाधान अब तक मेरे लिए काम नहीं किया। मुझे अभी ऐसी ही समस्या थी। मैं बोली के साथ लपेटकर इसे हल करने में कामयाब रहा। स्क्रीनशॉट देखें। वू।

यहां छवि विवरण दर्ज करें

मूल:

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o


0

आपको जो त्रुटि मिल रही है, वह है "अनपेक्षित टोकन ओ" क्योंकि json अपेक्षित है लेकिन पार्स करते समय ऑब्जेक्ट प्राप्त होता है। वह "ओ" शब्द "वस्तु" का पहला अक्षर है।


0

एकमात्र गलती जो आप कर रहे हैं, आप पहले से ही पार्स की गई वस्तु को पार्स कर रहे हैं, इसलिए यह त्रुटि फेंक रहा है, इस का उपयोग करें और आप जाने के लिए अच्छा होगा।

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products[0].name); //name of item at 0th index

यदि आप संपूर्ण जसन को प्रिंट करना चाहते हैं तो JSON.stringify () का उपयोग करें


0

यह बहुत सारे कारणों से हो सकता है, लेकिन संभवतः एक अमान्य चार के लिए, इसलिए आप इसका उपयोग कर सकते हैं JSON.stringify(obj);जो आपकी वस्तु को JSON में बदल देगा लेकिन याद रखें कि यह एक JQUERY अभिव्यक्ति है।


0

मेरे पास यह त्रुटि है BECAUSE API जो json ऑब्जेक्ट लौटाता है वह AN ERROR दे रहा था (मेरे मामले में कोड इग्नाइटर, एक HTML लौटाएं जब php कोड विफल हो जाता है) तो यह एक JSON नहीं है।

SQL सेंटेंस और PHP कोड की जाँच करें, और पोस्टमैन (या कुछ अन्य एपीआई परीक्षक) के साथ इसका परीक्षण करें


0

मैं जो गलती कर रहा था वह गुजर रही थी null JSON.parse () में अनजाने ।

तो यह फेंक दिया Unexpected token n in JSON at position 0


-24

का उपयोग करें eval। यह जावास्क्रिप्ट अभिव्यक्ति / कोड को स्ट्रिंग के रूप में लेता है और इसका मूल्यांकन / निष्पादन करता है।

eval(inputString);

Eval () का प्रत्येक मंगलाचरण जावास्क्रिप्ट दुभाषिया का एक नया उदाहरण बनाता है। यह एक संसाधन हॉग हो सकता है।
योरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.