Uncaught SyntaxError: Mã thông báo bất ngờ với JSON.parse


190

Điều gì gây ra lỗi này trên dòng thứ ba?

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

Mở bảng điều khiển để xem lỗi


16
Bạn không có JSON nào? Đó là một mảng / đối tượng theo nghĩa đen.
Bergi

Câu trả lời:


219

productslà một đối tượng. (tạo từ một đối tượng theo nghĩa đen)

JSON.parse()được sử dụng để chuyển đổi một chuỗi chứa ký hiệu JSON thành một đối tượng Javascript.

Mã của bạn biến đối tượng thành một chuỗi (bằng cách gọi .toString()) để cố phân tích nó dưới dạng văn bản JSON.
Trả .toString()về mặc định "[object Object]", không phải là JSON hợp lệ; do đó có lỗi.


1
nó không phải là một mảng? Tại sao nó là một đối tượng. Các đối tượng bắt đầu bằng {và mảng bắt đầu bằng [? hoặc tôi sai ở đây

4
Mảng là đối tượng; đó là những gì .toString()trả về (theo thông số kỹ thuật).
SLaks

1
Là giải pháp để xâu chuỗi các đối tượng đầu tiên?
Mohammed Noureldin

6
@MohammedNoureldin: Không; giải pháp là không làm gì và sử dụng đối tượng của bạn.
SLaks

1
Điều gì xảy ra nếu tôi lấy dữ liệu của mình từ một dịch vụ từ xa bằng Ajax, điều này mang lại cho tôi phản hồi Json? Và tôi muốn phản hồi đó được lưu trong đối tượng mảng JavaScript?
Mohammed Noureldin

126

Giả sử bạn biết JSON hợp lệ nhưng bạn vẫn nhận được ...

Trong trường hợp đó, có khả năng có các ký tự ẩn / đặc biệt trong chuỗi từ bất kỳ nguồn nào bạn nhận được chúng. Khi bạn dán vào trình xác nhận, chúng sẽ bị mất - nhưng trong chuỗi chúng vẫn ở đó. Những ký tự đó, trong khi vô hình, sẽ phá vỡJSON.parse()

Nếu slà JSON thô của bạn, thì hãy dọn sạch nó bằng:

// 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);

Tôi đã nhận được lỗi và tôi đã theo dõi nó đến một nhân vật kỳ lạ trong một chuỗi. Tôi đã sử dụng phương pháp của bạn để loại bỏ các ký tự JSON không hợp lệ và nó đã hoạt động.
albertski

1
đã đến đây hai lần bây giờ thnx
Benjamin Hoffman

Có một ký tự đặc biệt sau khi giải mã Base64, phương pháp của bạn đã giúp tôi rất nhiều! Thx
Guillaume

không tin tưởng một nguồn phản hồi với JSON không hợp lệ. Chỉ cần thông báo cho họ rằng dữ liệu bị hỏng. họ nên sửa nó. nếu bạn cố gắng "phục hồi" phản hồi như thế này hoặc theo cách tương tự, bạn sẽ giữ một giao tiếp không ổn định.
Onur Yıldırım

Nên s = s.replace(/[\u0000-\u001F]+/g,""); thay thế s = s.replace(/[\u0000-\u0019]+/g,""); , để thay thế tất cả các ký tự điều khiển. Đúng?
HongchaoZhang 17/8/2016

63

Có vẻ như bạn muốn xâu chuỗi đối tượng. Vì vậy, làm điều này:

JSON.stringify(products);

Lý do của lỗi là JSON.parse()mong đợi một Stringgiá trị và productslà một Array.

Lưu ý: Tôi nghĩ rằng nó cố gắng json.parse('[object Array]')phàn nàn rằng nó không mong đợi mã thông báo osau [.


28

Tôi thấy vấn đề tương tự với JSON.parse(inputString) .

Trong trường hợp của tôi, chuỗi đầu vào đến từ trang máy chủ của tôi [trả về một phương thức trang] .

Tôi đã in typeof(inputString) - đó là chuỗi, vẫn xảy ra lỗi.

Tôi cũng đã thử JSON.stringify(inputString) , nhưng nó không giúp được gì.

Sau đó tôi thấy đây là một vấn đề với nhà điều hành dòng mới [\n] , bên trong một giá trị trường.

Tôi đã thay thế [bằng một số nhân vật khác, đặt lại dòng mới sau khi phân tích cú pháp] và mọi thứ đều hoạt động tốt.


2
Nhân vật dòng mới cũng là vấn đề của tôi. Vậy làm thế nào chúng ta có thể khôi phục dữ liệu đó?
kolenda

@kolenda Bạn có JSON không hợp lệ. Bạn cần thay đổi máy chủ của mình để sử dụng trình tuần tự JSON thực tế trả về JSON hợp lệ.
SLaks

Tôi gặp vấn đề tương tự nhưng thay vì "\ n" Tôi có "\ e" bên trong một đường dẫn (Tôi đã thay đổi mã phía máy chủ để sử dụng "/" thay vì "\" và mọi thứ đã hoạt động trở lại)
Adam Tal

sử dụng một lối thoát trong đó \ n
Paul Gregoire

13

JSON.parse đang chờ một chuỗi trong tham số. Bạn cần xâu chuỗi đối tượng JSON của bạn để giải quyết vấn đề.

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"}];

thay đổi thành

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 có thể sử dụng sản phẩm trực tiếp. nhưng nếu anh ta muốn sử dụng JSON.parse, các đối số cần phải là một chuỗi.
pktangyue

Tôi nên làm gì trong ASP Classic vì 'là bình luận
bishatt bhatt

1
@ashishbhatt bạn có thể sử dụng ", sau đó thay đổi tất cả" thành \ "khác
pktangyue

2
Một cái gì đó như thế nàyJSON.parse(products.replace(/'/g, '"'))
Lập trình viên hóa học

10

Bạn nên xác thực chuỗi JSON của mình tại đây .

Chuỗi JSON hợp lệ phải có dấu ngoặc kép quanh các khóa:

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

Nếu không có dấu ngoặc kép, nó sẽ gây ra lỗi:

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

Sử dụng dấu ngoặc đơn cũng sẽ gây ra lỗi:

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

Trong trường hợp của tôi, Grails 2.5.6 được hiển thị render ([key: value])với các dấu ngoặc đơn, dẫn đến parseError JSON ở vị trí 1 trong câu đố Ajax. render (groovy.json.JsonOutput.toJson ([key:value]))đã giúp tôi ra ngoài.
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"
  }
]

Đây là Json hoàn hảo của bạn mà bạn có thể phân tích.


3

Đây là một chức năng tôi đã thực hiện dựa trên các phản hồi trước đó: nó hoạt động trên máy của tôi nhưng 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

Một gotcha khác có thể dẫn đến "SyntaxError: Unexpected token"ngoại lệ khi gọi JSON.parse()đang sử dụng bất kỳ điều nào sau đây trong các giá trị chuỗi:

  1. Nhân vật dòng mới.

  2. Các tab (có, các tab mà bạn có thể tạo bằng phím Tab!)

  3. Bất kỳ dấu gạch chéo độc lập nào \(nhưng vì một số lý do không /, ít nhất là không phải trên Chrome.)

(Để biết danh sách đầy đủ, hãy xem phần Chuỗi tại đây .)

Chẳng hạn, những điều sau đây sẽ giúp bạn có được ngoại lệ này:

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

Vì vậy, nó nên được thay đổi thành:

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

Điều đó, tôi nên nói, làm cho nó khá khó đọc ở định dạng chỉ JSON với số lượng văn bản lớn hơn.



1

Hy vọng điều này sẽ giúp người khác.

Vấn đề của tôi là tôi đã nhận xét HTML trong hàm gọi lại PHP thông qua AJAX đang phân tích cú pháp các bình luận và trả về JSON không hợp lệ.

Khi tôi xóa HTML đã nhận xét, tất cả đều tốt và JSON được phân tích cú pháp mà không gặp vấn đề gì.


0

sản phẩm là một mảng có thể được sử dụng trực tiếp:

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

Bây giờ rõ ràng \r, \b, \t,\f , vv không phải là ký tự chỉ có vấn đề mà có thể cung cấp cho bạn lỗi này.

Lưu ý rằng một số trình duyệt có thể có các yêu cầu bổ sung cho đầu vào củaJSON.parse .

Chạy mã kiểm tra này trên trình duyệt của bạn:

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);

Thử nghiệm trên Chrome, tôi thấy rằng nó không cho phép JSON.parse(String.fromCharCode(0x22, x, 0x22));ở đâux 34, 92 hoặc từ 0 đến 31.

Chars 34 và 92 là "\ tương ứng là các ký tự ký tự, và chúng thường được mong đợi và thoát đúng. Đó là ký tự 0 đến 31 sẽ cung cấp cho bạn các vấn đề.

Để giúp gỡ lỗi, trước khi bạn thực hiện JSON.parse(input), trước tiên hãy xác minh rằng đầu vào không chứa các ký tự có vấn đề:

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

Tại sao bạn cần JSON.parse? Nó đã có trong định dạng đối tượng.

Sử dụng tốt hơn JSON.opesify như dưới đây: var b = JSON.stringify(products);

Điều này có thể giúp bạn.


0

Ôi trời, các giải pháp trong tất cả các câu trả lời trên được cung cấp cho đến nay không có tác dụng với tôi. Tôi đã có một vấn đề tương tự như bây giờ. Tôi quản lý để giải quyết nó với gói với trích dẫn. Xem ảnh chụp màn hình. Ôi.

nhập mô tả hình ảnh ở đây

Nguyên:

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

Lỗi bạn đang gặp, tức là "mã thông báo bất ngờ o" là do json được mong đợi nhưng đối tượng thu được trong khi phân tích cú pháp. Chữ "o" đó là chữ cái đầu tiên của từ "đối tượng".


0

Lỗi duy nhất bạn đang làm là, bạn đang phân tích cú pháp đối tượng đã phân tích cú pháp nên đó là lỗi ném, sử dụng điều này và bạn sẽ ổn.

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

nếu bạn muốn in toàn bộ json thì hãy sử dụng JSON.opesify ()


0

Nó có thể xảy ra vì nhiều lý do, nhưng có lẽ đối với một char không hợp lệ, vì vậy bạn có thể sử dụng JSON.stringify(obj);nó sẽ biến đối tượng của bạn thành JSON nhưng hãy nhớ rằng đó là biểu thức JQUERY.


0

Tôi gặp lỗi này TRỞ THÀNH API đã trả về đối tượng json đang đưa ra L ERI (trong trường hợp của tôi là Igniter Code, trả về một html khi mã php không thành công) vì vậy KHÔNG PHẢI LÀ ĐỐI TƯỢNG JSON.

Kiểm tra các câu SQL và mã PHP và kiểm tra nó với Postman (hoặc một số trình kiểm tra API khác)


0

Sai lầm tôi đã làm là vượt qua null (vô tình) vào JSON.parse ().

Vì vậy, nó đã ném Unexpected token n in JSON at position 0


-24

Sử dụng eval. Nó nhận biểu thức / mã JavaScript dưới dạng chuỗi và đánh giá / thực thi nó.

eval(inputString);

Mỗi lời gọi của eval () tạo ra một phiên bản mới của trình thông dịch JavaScript. Đây có thể là một con heo tài nguyên.
Yëco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.