SyntaxError: โทเค็นที่ไม่คาดคิด o ใน JSON ที่ตำแหน่ง 1


140

ฉันแยกวิเคราะห์ข้อมูลบางส่วนโดยใช้คลาสประเภทในคอนโทรลเลอร์ของฉันฉันได้รับข้อมูลดังนี้:

{  
   "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.parseคุณอาจจะไม่จำเป็นต้องใช้ ลองใช้userDataโดยตรงเป็นวัตถุ
Mohit Bhardwaj

13
หากconsole.log(typeof userData)แสดงแสดงว่าobjectคุณมีออบเจ็กต์จาวาสคริปต์อยู่แล้วและไม่ใช่สตริง JSON ที่คุณต้องแยกวิเคราะห์
t.niese

1
@MohitBhardwaj ใช่ไม่จำเป็นต้องใช้สำหรับการแยกวิเคราะห์ ..
Soniya Mohan

5
โดยปกติเมื่อใดก็ตามที่คุณได้รับข้อผิดพลาดนี้Unexpected token o in JSONอาจเป็นไปได้ว่าคุณกำลังพยายามแยกวิเคราะห์วัตถุที่อยู่ในรูปแบบที่แยกวิเคราะห์แล้ว
Mohit Bhardwaj

@MohitBhardwaj โอเค!
Soniya Mohan

คำตอบ:


195

JSON ที่คุณโพสต์ดูดีอย่างไรก็ตามในโค้ดของคุณมักจะไม่ใช่สตริง JSON อีกต่อไป แต่เป็นวัตถุ JavaScript อยู่แล้ว ซึ่งหมายความว่าไม่จำเป็นต้องแยกวิเคราะห์อีกต่อไป

คุณสามารถทดสอบได้ด้วยตัวเองเช่นในคอนโซลของ 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()วิธีการของ JavaScript วัตถุโดยผลตอบแทนเริ่มต้น[object Object]ส่งผลให้พฤติกรรมที่สังเกต

ลองทำสิ่งต่อไปนี้แทน:

var newData = userData.data.userList;

1
สิ่งนี้ใช้ได้กับเบราว์เซอร์ทุกประเภทหรือไม่?
comeOnGetIt

@Timo คุณช่วยดูลิงค์นี้ได้ไหม
Martin

บางครั้งข้อผิดพลาดนี้อาจปรากฏขึ้นเมื่อปลายทางของ url api ที่ให้บริการคำขอมีข้อผิดพลาดในรหัสหรือไฟล์อื่น ๆ ที่รวมหรือใช้แล้วและเกิดข้อผิดพลาดซึ่งไม่ได้รับการจัดการหรือระบุไว้ ส่วนใหญ่คุณจะได้รับสิ่งนี้หากคุณดูที่แท็บเครือข่ายในเครื่องมือสำหรับนักพัฒนาเบราว์เซอร์หรือคุณสามารถกดจุดสิ้นสุดโดยใช้คนโพสต์และดูว่าเกิดอะไรขึ้น
MuturiAlex

67

พารามิเตอร์แรกของฟังก์ชันJSON.parseควรเป็น String และข้อมูลของคุณเป็นวัตถุ JavaScript ดังนั้นจึงจะแปลงเป็น String [object object]คุณควรใช้JSON.stringifyก่อนส่งผ่านข้อมูล

JSON.parse(JSON.stringify(userData))

1
พี่ช่วยได้มาก ขอบคุณ :)
Anand_5050

มันช่วยได้ขอบคุณสำหรับการแก้ปัญหา
Nag Arjun

คุณบันทึกวันของฉัน ขอบคุณ :)
Dwarkesh Soni

สิ่งนี้จะใช้ไม่ได้เมื่อสตริงมีเครื่องหมายอัญประกาศคู่คุณมีวิธีแก้ไขหรือไม่
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
สิ่งนี้ไม่ได้ตอบคำถาม แต่แสดงความคิดเห็นเกี่ยวกับการขาดการจัดการข้อยกเว้น
Richard Duerr

2
@RichardDuerr แต่สิ่งนี้จะช่วยแก้ไขข้อผิดพลาดของหัวข้อใหญ่ เช่น SyntaxError: โทเค็นที่ไม่คาดคิด o ใน JSON ที่ตำแหน่ง 1
Niko Jojo

6
นั่นเป็นเพียงการซ่อนข้อผิดพลาด แต่ไม่สามารถแก้ไขได้จริง
Richard Duerr

21

ด้านบนJSON.parseใช้:

var newData = JSON.stringify(userData)

4
JSON.stringify()แปลงวัตถุ JavaScript เป็นการแสดงสตริงซึ่งตรงข้ามกับสิ่งที่JSON.parse()ทำ คุณได้รับSyntaxErrorเนื่องจากคุณพยายามแยกวิเคราะห์บางสิ่งที่เป็นวัตถุอยู่แล้ว ในโซลูชันของ @ Sukhchain จะถูกแปลงเป็นสตริงเพื่อหลีกเลี่ยงปัญหานั้น
Hubert

1
ข้อเสียคือท้ายที่สุดคุณใช้งานJSON.parse()ซ้ำซ้อนมากเกินไป แม้ว่าจะเป็นกระบวนการที่ค่อนข้างรวดเร็ว แต่การแยกวิเคราะห์ JSON จะทำพร้อมกันและอาจบล็อก UI ของคุณได้ดังนั้นฉันไม่แนะนำให้ใช้สิ่งนั้น คุณสามารถตรวจสอบได้ว่าตัวแปรของคุณเป็นออบเจ็กต์หรือไม่เช่นใช้typeof(userData) === 'object'ก่อนที่จะพยายามแยกวิเคราะห์
Hubert

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

เกิดข้อผิดพลาด 'O' ที่ไม่คาดคิดเมื่อข้อมูล JSON หรือ String เกิดการแยกวิเคราะห์

ถ้าเป็นสตริงแสดงว่าเป็นสตริงแล้ว การแยกวิเคราะห์จะลงเอยด้วยข้อผิดพลาด "O" ที่ไม่คาดคิด

ฉันเผชิญสิ่งที่คล้ายกัน (แม้ว่าจะอยู่ในบริบทที่ต่างกัน) ฉันแก้ไขข้อผิดพลาดต่อไปนี้โดยการลบ JSON Producer

    @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 }) ใช้งานได้ดี เอาต์พุต: ตกลง

ระวัง: นอกจากนี้ในฝั่งไคลเอ็นต์หากคุณส่งคำขอ ajax และใช้ JSON.parse ("ตกลง") มันจะส่งโทเค็นที่ไม่คาดคิด 'O'

Oคืออักษรตัวแรกของสตริง

JSON.parse (object) เปรียบเทียบกับ jQuery.parseJSON (object);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); - ใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.