Uncaught SyntaxError: โทเค็นที่ไม่คาดคิดกับ JSON.parse


192

สิ่งที่ทำให้เกิดข้อผิดพลาดนี้ในบรรทัดที่สาม?

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 หรือ มันเป็นอาร์เรย์ / วัตถุตามตัวอักษร
Bergi

คำตอบ:


220

productsเป็นวัตถุ (การสร้างจากวัตถุตามตัวอักษร)

JSON.parse()ใช้ในการแปลงสตริงที่มีสัญลักษณ์ JSON เป็นวัตถุ Javascript

รหัสของคุณเปลี่ยนวัตถุเป็นสตริง (โดยการโทร.toString()) เพื่อพยายามแยกมันเป็นข้อความ JSON ผลตอบแทน
เริ่มต้นซึ่งไม่ถูกต้อง JSON; ดังนั้นข้อผิดพลาด.toString()"[object Object]"


1
มันไม่ได้เป็นอาเรย์หรือ? ทำไมมันเป็นวัตถุ วัตถุเริ่มต้นด้วย {และอาร์เรย์เริ่มต้นด้วย [? หรือฉันเป็นเท็จที่นี่

4
อาร์เรย์เป็นวัตถุ นั่นคือสิ่งที่.toString()ผลตอบแทน (ตามสเป็ค)
SLaks

1
การแก้ปัญหาเพื่อทำให้วัตถุเป็นวัตถุเป็นอันดับแรกหรือไม่
Mohammed Noureldin

6
@MohammedNoureldin: ไม่; ทางออกคือไม่ทำอะไรเลยและใช้วัตถุของคุณ
slaks

2
จะเกิดอะไรขึ้นถ้าฉันได้รับข้อมูลจากบริการระยะไกลโดยใช้ Ajax ซึ่งให้การตอบกลับแบบ Json แก่ฉัน และฉันต้องการให้การตอบสนองนั้นถูกบันทึกไว้ในวัตถุอาร์เรย์ JavaScript หรือไม่
Mohammed Noureldin

125

สมมติว่าคุณรู้ว่าเป็น 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 ที่ไม่ถูกต้องและใช้งานได้
albertski

1
มาที่นี่สองครั้งแล้ว ขอบคุณ
Benjamin Hoffman

มีอักขระพิเศษต่อท้ายหลังจากถอดรหัส Base64 วิธีการของคุณช่วยฉันได้มาก! ขอบคุณ
Guillaume

อย่าเชื่อถือแหล่งที่มาที่ตอบสนองด้วย JSON ที่ไม่ถูกต้อง เพียงแจ้งให้ทราบว่าข้อมูลเสียหาย พวกเขาควรแก้ไข หากคุณพยายาม "กู้คืน" คำตอบเช่นนี้หรือด้วยวิธีที่คล้ายกันคุณจะรักษาการสื่อสารที่ไม่เสถียร
Onur Yıldırım

ควรs = s.replace(/[\u0000-\u001F]+/g,""); แทนที่s = s.replace(/[\u0000-\u0019]+/g,""); เพื่อแทนที่อักขระควบคุมทั้งหมด ขวา?
HongchaoZhang

64

ดูเหมือนว่าคุณต้องการทำให้วัตถุเป็นสตริง ดังนั้นทำสิ่งนี้:

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 serializer จริงที่ส่งคืน JSON ที่ถูกต้อง
SLaks

ฉันมีปัญหาที่คล้ายกัน แต่แทนที่จะเป็น "\ n" ฉันมี "\ e" อยู่ในพา ธ (ฉันเปลี่ยนรหัสฝั่งเซิร์ฟเวอร์ให้ใช้ "/" แทน "\" และทุกอย่างทำงานได้อีกครั้ง)
Adam Tal

ใช้การหลบหนีที่ \ n จะเป็น \\ n
Paul Gregoire

14

JSON.parse กำลังรอพารามิเตอร์ String in คุณต้องทำให้วัตถุ 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
@SLaks yep, OP สามารถใช้ผลิตภัณฑ์โดยตรง แต่ถ้าเขาต้องการใช้JSON.parseargs จำเป็นต้องเป็นสตริง
pktangyue

ฉันควรทำอย่างไรใน ASP Classic เพราะ 'คือความคิดเห็น
ashish bhatt

1
@ashishbhatt คุณสามารถใช้ "แล้วเปลี่ยน" to \ "อื่น ๆ ทั้งหมดได้
pktangyue

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

ในกรณีของฉัน Grails 2.5.6 แสดงผลrender ([key: value])ด้วยเครื่องหมายคำพูดเดียวนำไปสู่ ​​JSON parseError ที่ตำแหน่ง 1 ใน jquery Ajax render (groovy.json.JsonOutput.toJson ([key:value]))ช่วยฉันออก
philburns


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

นี่คือฟังก์ชั่นที่ฉันทำตามคำตอบก่อนหน้า: มันใช้งานได้บนเครื่องของฉัน แต่เป็น YMMV

          /**
             * @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

gotcha อื่นที่อาจส่งผลให้เกิด"SyntaxError: Unexpected token"ข้อยกเว้นเมื่อเรียกJSON.parse()ใช้สิ่งใด ๆ ต่อไปนี้ในค่าสตริง:

  1. อักขระขึ้นบรรทัดใหม่

  2. แท็บ (ใช่แล้วแท็บที่คุณสามารถผลิตได้ด้วยปุ่ม Tab!)

  3. เครื่องหมายทับอย่างใดอย่างหนึ่ง\(แต่ด้วยเหตุผลบางอย่างไม่/อย่างน้อยไม่ได้อยู่บน Chrome)

(สำหรับรายการทั้งหมดดูที่หัวข้อสตริงที่นี่ )

ตัวอย่างต่อไปนี้จะทำให้คุณได้รับข้อยกเว้นนี้:

{
    "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

หวังว่านี่จะช่วยคนอื่นได้

ปัญหาของฉันคือการที่ฉันได้แสดงความคิดเห็น HTML ในฟังก์ชั่นการโทรกลับ PHP ผ่าน AJAX ที่แยกวิเคราะห์ความคิดเห็นและส่งกลับ 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);

การทดสอบบน Chrome ผมเห็นว่ามันไม่ได้ช่วยให้JSON.parse(String.fromCharCode(0x22, x, 0x22));ที่x 34, 92 หรือจาก 0 ถึง 31

ตัวอักษร 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

โอ้มนุษย์คำตอบในคำตอบทั้งหมดข้างต้นนั้นไม่ได้ผล ตอนนี้ฉันมีปัญหาคล้ายกัน ฉันจัดการเพื่อแก้ปัญหาด้วยการตัดคำพูด ดูภาพหน้าจอ Whoo

ป้อนคำอธิบายรูปภาพที่นี่

เดิม:

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 คาดว่าจะได้ แต่วัตถุจะได้รับในขณะที่การแยก "o" นั้นเป็นอักษรตัวแรกของคำว่า "object"


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 ทั้งหมดให้ใช้ JSON.stringify ()


0

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


0

ฉันมีข้อผิดพลาดนี้เพราะ API ที่ส่งคืนวัตถุ json ให้ข้อผิดพลาด (ในกรณี Code Code Igniter ของฉันส่งคืน html เมื่อโค้ด php ล้มเหลว) ดังนั้นจึงไม่ใช่ JSON OBJECT

ตรวจสอบประโยค SQL และโค้ด PHP และทดสอบด้วยบุรุษไปรษณีย์ (หรือผู้ทดสอบ API อื่น ๆ )


0

ความผิดพลาดที่ฉันทำอยู่นั้นผ่านไปแล้ว null (ไม่รู้) ไปยัง JSON.parse ()

ดังนั้นมันจึงโยน Unexpected token n in JSON at position 0


-24

evalใช้ มันใช้การแสดงออก JavaScript / รหัสเป็นสตริงและประเมิน / รันมัน

eval(inputString);

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