SyntaxError: JSON में अनपेक्षित टोकन ओ 1 स्थिति पर


139

मैं अपने नियंत्रक में एक प्रकार के वर्ग का उपयोग कर कुछ डेटा पार्स कर रहा हूँ जो मुझे निम्न प्रकार से डेटा मिल रहा है:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

मैंने इस तरह से डेटा स्टोर करने की कोशिश की

var userData = _data;
var newData = JSON.parse(userData).data.userList;

मैं उपयोगकर्ता सूची को एक नए चर में कैसे निकाल सकता हूं?


11
आपको उपयोग करने की आवश्यकता नहीं हो सकती है JSON.parseuserDataएक वस्तु के रूप में सीधे उपयोग करने का प्रयास करें ।
मोहित भारद्वाज

13
यदि console.log(typeof userData)दिखाता है कि objectआपके पास पहले से ही एक जावास्क्रिप्ट ऑब्जेक्ट है और JSON स्ट्रिंग नहीं है तो आपको पार्स करने की आवश्यकता है।
t.niese

1
@MohitBhardwaj हां, तोते के लिए जरूरी नहीं ..
सोनिया मोहन

5
आमतौर पर जब भी आपको यह त्रुटि मिलती है - Unexpected token o in JSON, तो संभवतः आप एक ऐसी वस्तु को पार्स करने की कोशिश कर रहे हैं जो पहले से ही पार्स रूप में है।
मोहित भारद्वाज

@MohitBhardwaj ठीक है!
सोनिया मोहन

जवाबों:


191

आपके द्वारा पोस्ट किया गया JSON ठीक दिखता है, हालाँकि आपके कोड में, यह संभवतः JSON स्ट्रिंग नहीं है, लेकिन पहले से ही जावास्क्रिप्ट ऑब्जेक्ट है। इसका मतलब है, कोई और अधिक आवश्यक है।

आप स्वयं इसका परीक्षण कर सकते हैं, जैसे Chrome के कंसोल में:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

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

इसके बजाय निम्नलिखित प्रयास करें:

var newData = userData.data.userList;

1
तो यह सभी प्रकार के ब्राउज़रों के लिए लागू है?
आनाऑगेइट

@Timo क्या आप इस लिंक को देख सकते हैं
वी एसएच

कभी-कभी यह त्रुटि तब सामने आ सकती है जब अनुरोध करने वाले एपीआई यूआरएल एंडपॉइंट के कोड या किसी अन्य शामिल या उपयोग की गई फ़ाइल में कोई त्रुटि होती है और यह एक ऐसी त्रुटि फेंकता है जिसे संभाला या नोट नहीं किया जाता है। ज्यादातर आप इसे प्राप्त कर सकते हैं यदि आप ब्राउज़र डेवलपर टूल में नेटवर्क टैब को देखते हैं या आप पोस्ट मैन का उपयोग करके समापन बिंदु को हिट कर सकते हैं और देख सकते हैं कि क्या आता है।
मटुरिलेक्स

65

फ़ंक्शन का पहला पैरामीटर JSON.parseस्ट्रिंग होना चाहिए, और आपका डेटा एक जावास्क्रिप्ट ऑब्जेक्ट है, इसलिए यह स्ट्रिंग में बदल जाएगा [object object], आपको JSON.stringifyडेटा पास करने से पहले उपयोग करना चाहिए

JSON.parse(JSON.stringify(userData))

1
ग्रेट ने भाई की मदद की। धन्यवाद :)
आनंद_ ५०५०

यह मदद की। समाधान के लिए धन्यवाद।
नाग अर्जुन

आपने मेरा दिन बचा लिया भाई। धन्यवाद :)
द्वारकेश सोनी

यह तब काम नहीं करेगा जब स्ट्रिंग में एक दोहरे उद्धरण समाहित हो, क्या आपके पास कोई समाधान है
Mr S Coder

23

JSON.parseइसे try-catchब्लॉक में लपेटे बिना कभी इस्तेमाल न करें :

// payload 
let userData = null;

try {
    // Parse a JSON
    userData = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
यह वास्तव में सवाल का जवाब नहीं देता है, लेकिन अपवाद हैंडलिंग की कमी पर टिप्पणी करता है।
रिचर्ड ड्यूयर

2
@RichardDuerr, लेकिन यह सिर विषय की त्रुटि को ठीक करने में मदद करेगा। यानी सिंटैक्सएयर: जेन्सन में अप्रत्याशित टोकन ओ में 1 स्थान पर
निको जोजो

6
यह केवल त्रुटि को छिपाता है, लेकिन वास्तव में इसे हल नहीं करता है।
रिचर्ड ड्यूयर

21

बस ऊपर JSON.parse, उपयोग करें:

var newData = JSON.stringify(userData)

4
JSON.stringify()एक जावास्क्रिप्ट ऑब्जेक्ट को इसके स्ट्रिंग प्रतिनिधित्व में परिवर्तित करता है, जो कि इसके विपरीत JSON.parse()है। आपको SyntaxErrorइसलिए मिल रहा था क्योंकि आप उस चीज़ को पार्स करने की कोशिश कर रहे थे जो पहले से ही एक वस्तु थी। @ सुखचैन के समाधान में, इससे बचने के लिए इसे एक स्ट्रिंग में बदल दिया जाता है।
ह्यूबर्ट

1
इसका नकारात्मक पक्ष यह है कि अंत में आप JSON.parse()बहुत अधिक अनावश्यक रूप से उपयोग कर रहे हैं । हालांकि यह एक बहुत तेज़ प्रक्रिया है, JSON को पार्स करना समकालिक रूप से किया जाता है और संभवतः आपके UI को ब्लॉक कर सकता है, इसलिए मैं इसका उपयोग करने के खिलाफ सलाह दूंगा। इसके बजाय, आप जांच सकते हैं कि क्या आपका चर एक वस्तु है, उदाहरण के लिए typeof(userData) === 'object'इसे पार्स करने के प्रयास से पहले उपयोग करना।
ह्यूबर्ट

2

खैर, मेरा मतलब था कि मुझे इस तरह वस्तु को पार्स करने की आवश्यकता है var jsonObj = {"first name" : "fname"}:। लेकिन, मैं वास्तव में नहीं है। क्योंकि यह पहले से ही एक JSON है।


2

हम इस तरह से चेक भी जोड़ सकते हैं:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

1

जब JSON डेटा या स्ट्रिंग पार्स होने के लिए होता है, तो अप्रत्याशित 'O' त्रुटि होती है।

यदि यह स्ट्रिंग है, तो यह पहले से ही स्ट्रिंग है। अनपेक्षित 'O' त्रुटि के साथ पार्सिंग समाप्त होती है।

मुझे समान (हालांकि अलग-अलग संदर्भ में) सामना करना पड़ा, मैंने JSON निर्माता को हटाकर निम्न त्रुटि को हल किया।

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

प्रतिक्रिया में "ओके" स्ट्रिंग रिटर्न शामिल है। एनोटेशन @Produces ({** MediaType.APPLICATION_JSON }) के रूप में चिह्नित किया गया है। ** स्ट्रिंग को JSON फॉर्मेट में पार्स करने की कोशिश करता है जिसके परिणामस्वरूप अनपेक्षित 'O' होता है

निकाला जा रहा है @Produces ({ MediaType.APPLICATION_JSON }) ठीक काम करता है। आउटपुट: ठीक है

खबरदार: इसके अलावा, ग्राहक की ओर से, यदि आप अजाक्स अनुरोध करते हैं और JSON.parse ("ओके") का उपयोग करते हैं, तो यह अप्रत्याशित टोकन 'ओ' फेंकता है

स्ट्रिंग का पहला अक्षर है

JSON.parse (ऑब्जेक्ट) की तुलना jQuery.parseJSON (ऑब्जेक्ट) से की जाती है;

JSON.parse ('{"नाम": "यूर्गेलेम", "शहर": "डोवर"}'); --- ठीक काम करता है

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