Tôi tiếp tục nhận được Unntaught SyntaxError: Mã thông báo không mong đợi


306

Tôi đang cố gắng học một số html / css / javascript, vì vậy tôi đang tự viết cho mình một dự án giảng dạy.

Ý tưởng là có một số từ vựng có trong một tệp json sau đó sẽ được tải vào một bảng. Tôi quản lý để tải tệp vào và in ra một trong các giá trị của nó, sau đó tôi bắt đầu viết mã để tải các giá trị vào bảng.

Sau khi làm điều đó tôi bắt đầu gặp lỗi, vì vậy tôi đã xóa tất cả mã tôi đã viết, chỉ còn lại một dòng (cùng dòng đã hoạt động trước đó) ... chỉ còn lỗi.

Lỗi như sau:

Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback

Mã javascript của tôi được chứa trong một tệp riêng biệt và chỉ đơn giản là thế này:

function loadPageIntoDiv(){
    document.getElementById("wokabWeeks").style.display = "block";
}

function loadWokab(){
    //also tried getJSON which threw the same error
    jQuery.get('wokab.json', function(data) {
        var glacier = JSON.parse(data);
    });
}

Và tệp JSON của tôi có ngay sau đây:

[
    {
        "english": "bag",
        "kana": "kaban",
        "kanji": "K"
    },

    {
        "english": "glasses",
        "kana": "megane",
        "kanji": "M"
    }
]

Bây giờ lỗi được báo cáo trong dòng 11 là var glacier = JSON.parse(data);dòng.

Khi tôi xóa tệp json, tôi gặp lỗi: "NHẬN http: //.../wokab.json 404 (Không tìm thấy)" vì vậy tôi biết rằng nó đang tải nó (hoặc ít nhất là đang cố gắng).


5
$ .get có thể nhận ra json khi nó được gửi, do đó. var glacier = data;nên đủ.
roselan

46
Tóm tắt: bạn đang cố phân tích cú pháp hai lần.
fiatjaf


Tôi đã nhận được điều tương tự Uncaught SyntaxError: Unexpected token Ivì mã hóa Pythonjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Câu trả lời:


314

Có vẻ như jQuery đoán về kiểu dữ liệu. Nó thực hiện phân tích cú pháp JSON ngay cả khi bạn không gọi getJSON () - sau đó khi bạn cố gắng gọi JSON.parse () trên một đối tượng, bạn sẽ gặp lỗi.

Giải thích thêm có thể được tìm thấy trong câu trả lời của Aditya Mittal .


13
Aha, vì vậy dữ liệu [0] .english trả về "túi". Có vẻ như tôi không phải phân tích tệp json.
Bjorninn

1
Điều đó thật thú vị .. Tôi đoán jquery đoán về kiểu dữ liệu và cho rằng đó là json. Tôi sẽ nghĩ rằng getJson cũng sẽ hoạt động, phải không?
ek_ny

87
Lưu ý nhỏ: nếu bạn JSON.parselà một đối tượng "bất ngờ o thẻ" được ném đơn giản chỉ vì nó cố gắng phân tích obj_to_parse.toString(), đó là [object Object]. Cố gắng JSON.parse('[object Object]');;)
Cầu tàu Paolo Ramon

22
Điều đó cũng xảy ra với tôi, tôi nghĩ rằng lỗi của tôi là tôi đã cố phân tích cú pháp JSON một cái gì đó đã là Đối tượng JSON
Wak

2
jQuery không đoán được . Nếu bạn không ghi đè lên nó dataType(bất kỳ lý do nào bạn sẽ), nó sẽ sử dụng Content-typetiêu đề HTTP của phản hồi để xác định loại dữ liệu đó là gì và phân tích cú pháp nếu đó là dữ liệu mà jQuery nhận ra.
Quentin

76

Vấn đề rất đơn giản

jQuery.get('wokab.json', function(data) {
    var glacier = JSON.parse(data);
});

Bạn đang phân tích cú pháp hai lần. getsử dụng dataType='json', vì vậy dữ liệu đã ở định dạng json. Sử dụng $.ajax({ dataType: 'json' ...để đặt loại dữ liệu trả về!


54

Về cơ bản nếu tiêu đề phản hồi là văn bản / html bạn cần phân tích cú pháp và nếu tiêu đề phản hồi là application / json thì nó đã được phân tích cú pháp cho bạn.

Dữ liệu được phân tích cú pháp từ trình xử lý thành công jquery cho phản hồi văn bản / html:

var parsed = JSON.parse(data);

Dữ liệu được phân tích cú pháp từ trình xử lý thành công jquery cho phản ứng ứng dụng / json:

var parsed = data;

6
Lưu ý cho bất cứ ai bỏ phiếu này, câu trả lời được chấp nhận ở trên có bản sao chính xác từ câu trả lời này. Thêm liên kết từ câu trả lời được chấp nhận ngay bây giờ.
Geoffrey Hale

11

Một gợi ý khác cho Unexpected tokenlỗi. Có hai sự khác biệt chính giữa các đối tượng javascript và json:

  1. dữ liệu json phải luôn được trích dẫn với dấu ngoặc kép.
  2. các khóa phải được trích dẫn

JSON chính xác

 {
    "english": "bag",
    "kana": "kaban",
    "kanji": "K"
}

Lỗi JSON 1

 {
    'english': 'bag',
    'kana': 'kaban',
    'kanji': 'K'
 }

Lỗi JSON 2

 {
    english: "bag",
    kana: "kaban",
    kanji: "K"
}

Ghi chú

Đây không phải là một câu trả lời trực tiếp cho câu hỏi đó. Nhưng đó là một câu trả lời cho Unexpected tokenlỗi. Vì vậy, nó có thể giúp đỡ những người khác vấp phải câu hỏi đó.


2

Đơn giản là phản hồi đã được phân tích cú pháp, bạn không cần phải phân tích lại. nếu bạn phân tích lại nó, nó sẽ cung cấp cho bạn "mã thông báo bất ngờ o" tuy nhiên bạn phải chỉ định kiểu dữ liệu trong yêu cầu của mình là loạidataType='json'


1

Tôi đã có một vấn đề tương tự chỉ bây giờ và giải pháp của tôi có thể giúp đỡ. Tôi đang sử dụng iframe để tải lên và chuyển đổi tệp xml thành json và gửi lại phía sau hậu trường và Chrome đã thêm một số rác vào dữ liệu đến sẽ chỉ xuất hiện không liên tục và gây ra "Uncaught SyntaxError: Unken token o" lỗi.

Tôi đã truy cập dữ liệu iframe như thế này:

$('#load-file-iframe').contents().text()

hoạt động tốt trên localhost, nhưng khi tôi tải nó lên máy chủ thì nó chỉ dừng hoạt động với một số tệp và chỉ khi tải các tệp theo một thứ tự nhất định. Tôi thực sự không biết điều gì gây ra nó, nhưng điều này đã khắc phục nó. Tôi đã thay đổi dòng trên

$('#load-file-iframe').contents().find('body').text()

một khi tôi nhận thấy một số rác trong phản hồi HTML.

Câu chuyện dài kiểm tra dữ liệu phản hồi HTML thô của bạn và bạn có thể bật một cái gì đó lên.


Được rồi cảm ơn. Kỳ lạ thay, đôi khi nó dường như nhận được một đối tượng json đã được phân tích cú pháp và đôi khi không. Tôi không có thời gian để tiếp tục dự án vì vậy tôi không biết liệu nó có ngẫu nhiên làm điều này không (tùy thuộc vào trình duyệt và hệ thống hoặc một cái gì đó). Cảm ơn con trỏ tôi sẽ ghi nhớ nó.
Bjorninn

1
SyntaxError: Unexpected token o in JSON

Điều này cũng xảy ra khi bạn quên sử dụng awaittừ khóa cho một phương thức trả về dữ liệu JSON.

Ví dụ:

async function returnJSONData()
{
   return "{\"prop\": 2}";
}

var json_str = returnJSONData();
var json_obj = JSON.parse(json_str);

sẽ ném một lỗi vì mất tích await. Những gì thực sự được trả về là một Promise[đối tượng], không phải a string.

Để khắc phục, chỉ cần thêm chờ đợi như bạn dự định:

var json_str = await returnJSONData();

Điều này khá rõ ràng, nhưng lỗi được gọi JSON.parse, vì vậy rất dễ bỏ lỡ nếu có một khoảng cách giữa awaitcuộc gọi phương thức của bạn và JSON.parsecuộc gọi.


0

Hãy chắc chắn rằng tệp JSON của bạn không có bất kỳ ký tự dấu trước hoặc sau. Có lẽ một không thể in? Bạn có thể muốn thử theo cách này:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]

1
JSON.parse ('[{"tiếng Anh": "túi", "kana": "kaban", "kanji": "K"}, {"tiếng anh": "kính", "kana": "megane", " kanji ":" M "}] '); Hoạt động tốt. Bạn đã thử thay thế dòng đó bằng cảnh báo (dữ liệu) để kiểm tra xem tệp có đang tải đúng không?
thexebolud

0
const getCircularReplacer = () => {
              const seen = new WeakSet();
              return (key, value) => {
                if (typeof value === "object" && value !== null) {
                  if (seen.has(value)) {
                    return;
                  }
                  seen.add(value);
                }
                return value;
              };
            };
JSON.stringify(tempActivity, getCircularReplacer());

Trong đó tempActivity đang xử lý dữ liệu tạo ra lỗi "SyntaxError: Mã thông báo không mong đợi o trong JSON ở vị trí 1 - Tràn ngăn xếp chồng lên nhau"

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.