Saya terus mendapatkan "Uncaught SyntaxError: Token yang tidak terduga"


306

Saya mencoba mempelajari beberapa html / css / javascript, jadi saya menulis sendiri proyek pengajaran.

Idenya adalah untuk memiliki beberapa kosakata yang terkandung dalam file json yang kemudian akan dimuat ke dalam tabel. Saya berhasil memuat file dan mencetak salah satu nilainya, setelah itu saya mulai menulis kode untuk memuat nilai ke dalam tabel.

Setelah melakukan itu saya mulai mendapatkan kesalahan, jadi saya menghapus semua kode yang saya tulis, meninggalkan saya dengan hanya satu baris (baris yang sama yang telah bekerja sebelumnya) ... hanya kesalahannya masih ada.

Kesalahannya adalah sebagai berikut:

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

Kode javascript saya terkandung dalam file terpisah dan hanya ini:

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

Dan file JSON saya hanya memiliki yang berikut ini sekarang:

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

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

Sekarang kesalahan dilaporkan pada baris 11 yang merupakan var glacier = JSON.parse(data);baris.

Ketika saya menghapus file json saya mendapatkan kesalahan: "DAPATKAN http: //.../wokab.json 404 (Tidak Ditemukan)" jadi saya tahu itu memuatnya (atau setidaknya mencoba).


5
$ .get bisa mengenali json saat dikirim, karenanya. var glacier = data;harus cukup.
roselan

46
Ringkasnya: Anda mencoba menguraikannya dua kali.
fiatjaf


Saya mendapatkan yang serupa Uncaught SyntaxError: Unexpected token Ikarena Python mengkodekanjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Jawaban:


314

Sepertinya jQuery menebak tentang tipe data. Ia melakukan parsing JSON meskipun Anda tidak memanggil getJSON () - lalu ketika Anda mencoba memanggil JSON.parse () pada suatu objek, Anda mendapatkan kesalahan.

Penjelasan lebih lanjut dapat ditemukan dalam jawaban Aditya Mittal .


13
Ya, jadi data [0] .english mengembalikan "tas". Sepertinya saya tidak perlu mem-parsing file json sama sekali.
Bjorninn

1
itu menarik .. kurasa jquery menebak datatype dan menganggap itu json. Saya akan berpikir bahwa getJson akan bekerja juga, kan?
ek_ny

87
Catatan kecil: jika Anda JSON.parsesebuah objek, "Token tak terduga" dilemparkan hanya karena ia mencoba menguraikan obj_to_parse.toString(), yaitu [object Object]. Coba JSON.parse('[object Object]');;)
Dermaga Paolo Ramon

22
Itu terjadi pada saya juga, saya pikir kesalahan saya adalah bahwa saya mencoba mengurai JSON sesuatu yang sudah menjadi Obyek JSON
Wak

2
jQuery tidak menebak . Jika Anda tidak menimpanya dengan dataType(apa pun alasannya), ia menggunakan Content-typeheader HTTP dari respons untuk menentukan jenis data apa itu, dan mem-parsingnya jika itu adalah data yang dikenali jQuery.
Quentin

76

Masalahnya sangat sederhana

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

Anda menguraikannya dua kali. getmenggunakan dataType='json', jadi data sudah dalam format json. Gunakan $.ajax({ dataType: 'json' ...untuk secara spesifik mengatur tipe data yang dikembalikan!


54

Pada dasarnya jika tajuk respons adalah teks / html Anda harus menguraikan, dan jika tajuk respons adalah aplikasi / json itu sudah diuraikan untuk Anda.

Data yang diurai dari penangan keberhasilan jquery untuk respons teks / html:

var parsed = JSON.parse(data);

Data yang diurai dari jquery success handler untuk aplikasi / json response:

var parsed = data;

6
Catatan untuk siapa saja yang memberikan suara ini, jawaban yang diterima di atas berisi salinan persis dari jawaban ini. Menambahkan tautan dari jawaban yang diterima sekarang.
Geoffrey Hale

11

Petunjuk lain untuk Unexpected tokenkesalahan. Ada dua perbedaan utama antara objek javascript dan json:

  1. data json harus selalu dikutip dengan tanda kutip ganda.
  2. kunci harus dikutip

JSON yang benar

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

Kesalahan JSON 1

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

Kesalahan JSON 2

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

Ucapan

Ini bukan jawaban langsung untuk pertanyaan itu. Tapi ini jawaban untuk Unexpected tokenkesalahan. Jadi mungkin itu membantu orang lain yang menemukan pertanyaan itu.


2

Cukup responsnya sudah diuraikan, Anda tidak perlu menguraikannya lagi. jika Anda menguraikannya lagi itu akan memberi Anda "token tak terduga" namun Anda harus menentukan tipe data dalam permintaan Anda untuk menjadi tipedataType='json'


1

Saya punya masalah yang sama tadi dan solusi saya mungkin membantu. Saya menggunakan iframe untuk mengunggah dan mengonversi file xml ke json dan mengirimkannya kembali di belakang layar, dan Chrome menambahkan beberapa sampah ke data yang masuk yang hanya akan muncul sebentar-sebentar dan menyebabkan "Sintaks Tanpa PerintahError: Token Tak Terduga" kesalahan.

Saya sedang mengakses data iframe seperti ini:

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

yang bekerja dengan baik di localhost, tetapi ketika saya mengunggahnya ke server berhenti bekerja hanya dengan beberapa file dan hanya ketika memuat file dalam urutan tertentu. Saya tidak benar-benar tahu apa yang menyebabkannya, tetapi ini memperbaikinya. Saya mengubah baris di atas menjadi

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

pernah saya perhatikan ada sampah di respon HTML.

Singkatnya, periksa data respons HTML mentah Anda dan Anda mungkin menemukan sesuatu.


Ok terima kasih. Anehnya itu kadang-kadang tampaknya menerima objek json yang sudah diuraikan dan kadang tidak. Saya belum punya waktu untuk melanjutkan proyek, jadi saya tidak tahu apakah ini akan melakukan ini secara acak (tergantung pada browser dan sistem atau sesuatu). Terima kasih untuk pointer saya akan mengingatnya.
Bjorninn

1
SyntaxError: Unexpected token o in JSON

Ini juga terjadi ketika Anda lupa menggunakan awaitkata kunci untuk metode yang mengembalikan data JSON.

Sebagai contoh:

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

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

akan melempar kesalahan karena yang hilang await. Apa yang sebenarnya dikembalikan adalah Promise[objek], bukan a string.

Untuk memperbaikinya tambahkan saja menunggu seperti yang seharusnya:

var json_str = await returnJSONData();

Ini seharusnya cukup jelas, tetapi kesalahannya dinyalakan JSON.parse, jadi mudah untuk dilewatkan jika ada jarak antara awaitpanggilan metode dan JSON.parsepanggilan.


0

Pastikan file JSON Anda tidak memiliki karakter tambahan sebelum atau sesudah. Mungkin yang tidak patut? Anda mungkin ingin mencoba cara ini:

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

1
JSON.parse ('[{"english": "bag", "kana": "kaban", "kanji": "K"}, {"english": "glasses", "kana": "megane", " kanji ":" M "}] '); Bekerja dengan baik. ¿Sudahkah Anda mencoba mengganti baris itu dengan peringatan (data) untuk memeriksa apakah file memuat dengan benar?
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());

Di mana tempActivity sedang mem-feting data yang menghasilkan kesalahan "SyntaxError: Token tak terduga o di JSON di posisi 1 - Stack Overflow"

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.