Uncaught SyntaxError: Token yang tidak terduga dengan JSON.parse

192

apa yang menyebabkan kesalahan ini di baris ketiga?

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

Buka konsol untuk melihat kesalahan

coiso
sumber
16
Anda tidak punya JSON? Ini adalah array / objek literal.
Bergi

Jawaban:

220

productsadalah sebuah objek. (Menciptakan dari objek literal)

JSON.parse()digunakan untuk mengkonversi string yang berisi notasi JSON menjadi objek Javascript.

Kode Anda mengubah objek menjadi string (dengan memanggil .toString()) untuk mencoba menguraikannya sebagai teks JSON.
Default .toString()kembali "[object Object]", yang tidak JSON valid; karenanya kesalahan.

Slaks
sumber
1
bukankah itu Array? Mengapa itu sebuah objek? Objek mulai dengan {dan array dimulai dengan [? atau saya salah di sini
4
Array adalah objek; itulah yang .toString()mengembalikan (sesuai spek).
SLaks
1
Apakah solusi untuk mengencangkan objek terlebih dahulu?
Mohammed Noureldin
6
@MohammedNoureldin: Tidak; solusinya adalah tidak melakukan apa-apa dan menggunakan objek Anda.
SLaks
2
Bagaimana jika saya mendapatkan data saya dari layanan jarak jauh menggunakan Ajax, yang memberi saya tanggapan Json? Dan saya ingin respons itu disimpan dalam objek array JavaScript?
Mohammed Noureldin
125

Katakanlah Anda tahu itu JSON yang valid tetapi Anda masih mendapatkan ini ...

Jika demikian, kemungkinan ada karakter tersembunyi / khusus di string dari sumber apa pun yang Anda dapatkan. Saat Anda menempelkan ke validator, mereka akan hilang - tetapi dalam string mereka masih ada. Karakter-karakter itu, meski tidak terlihat, akan pecahJSON.parse()

Jika sJSON mentah Anda, bersihkan dengan:

// 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);
EdH
sumber
Saya mendapatkan kesalahan dan saya melacaknya ke karakter aneh dalam sebuah string. Saya menggunakan metode Anda untuk menghapus karakter JSON yang tidak valid dan berhasil.
albertski
1
telah datang ke sini dua kali sekarang. thnx
Benjamin Hoffman
Mendapat karakter khusus tambahan setelah Base64 decoding, metode Anda banyak membantu saya! Thx
Guillaume
jangan percaya sumber merespons dengan JSON yang tidak valid. Cukup beri tahu mereka bahwa datanya rusak. mereka harus memperbaikinya. jika Anda mencoba "memulihkan" respons seperti ini atau dengan cara yang serupa, Anda akan menjaga komunikasi yang tidak stabil.
Onur Yıldırım
Seharusnya s = s.replace(/[\u0000-\u001F]+/g,""); bukan s = s.replace(/[\u0000-\u0019]+/g,""); , untuk mengganti semua karakter kontrol. Baik?
HongchaoZhang
64

Tampaknya Anda ingin merangkai objek. Jadi lakukan ini:

JSON.stringify(products);

Alasan untuk kesalahan adalah bahwa JSON.parse()mengharapkan Stringnilai dan productsmerupakan Array.

Catatan: Saya pikir ini upaya json.parse('[object Array]')yang mengeluh tidak mengharapkan token osetelahnya [.

Onur Yıldırım
sumber
28

Saya menemukan masalah yang sama dengan JSON.parse(inputString) .

Dalam kasus saya, string input berasal dari halaman server saya [pengembalian metode halaman] .

Saya mencetak typeof(inputString) - itu string, masih terjadi kesalahan.

Saya juga mencoba JSON.stringify(inputString) , tetapi itu tidak membantu.

Kemudian saya menemukan ini menjadi masalah dengan operator saluran baru [\n], di dalam nilai bidang.

Saya melakukan penggantian [dengan beberapa karakter lain, mengembalikan baris baru setelah parse] dan semuanya bekerja dengan baik.

Derin
sumber
2
Karakter baris baru juga masalah saya. Jadi bagaimana kita mengembalikan data seperti itu?
kolenda
@ Kolenda Anda memiliki JSON yang tidak valid. Anda perlu mengubah server Anda untuk menggunakan serializer JSON aktual yang mengembalikan JSON yang valid.
SLaks
Saya memiliki masalah yang serupa tetapi bukannya "\ n" Saya memiliki "\ e" di dalam path (saya mengubah kode sisi server untuk menggunakan "/" bukannya "\" dan semuanya bekerja kembali)
Adam Tal
gunakan pelarian dimana \ n
Paul Gregoire
14

JSON.parse sedang menunggu parameter String in. Anda perlu merangkai objek JSON Anda untuk menyelesaikan masalah.

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
Térence
sumber
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"}];

mengubah

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"}]';
pktangyue
sumber
2
@ SLaks ya, OP dapat menggunakan produk secara langsung. tetapi jika dia ingin menggunakan JSON.parse, argumen harus berupa string.
pktangyue
apa yang harus saya lakukan di ASP Classic karena 'is comment
ashish bhatt
1
@ashishbhatt dapat Anda gunakan ", lalu ubah semua yang lain" menjadi \ "
pktangyue
2
Sesuatu seperti iniJSON.parse(products.replace(/'/g, '"'))
Programmer Kimia
11

Anda harus memvalidasi string JSON Anda di sini .

String JSON yang valid harus memiliki tanda kutip ganda di sekitar tombol:

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

Jika tidak ada tanda kutip, itu akan menyebabkan kesalahan:

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

Menggunakan tanda kutip tunggal juga akan menyebabkan kesalahan:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1
hoogw
sumber
Dalam kasus saya, Grails 2.5.6 diberikan render ([key: value])dengan tanda kutip tunggal, yang mengarah ke JSON parseError di posisi 1 di jquery Ajax. render (groovy.json.JsonOutput.toJson ([key:value]))membantu saya.
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"
  }
]

Ini Json sempurna Anda yang dapat Anda parsing.

San
sumber
3

Inilah fungsi yang saya buat berdasarkan balasan sebelumnya: berfungsi pada mesin saya tetapi 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;
            }
murmur
sumber
2

Satu gotcha lain yang dapat menghasilkan "SyntaxError: Unexpected token"pengecualian saat memanggil JSON.parse()menggunakan salah satu dari yang berikut ini dalam nilai string:

  1. Karakter baris baru.

  2. Tab (ya, tab yang dapat Anda hasilkan dengan tombol Tab!)

  3. Setiap tebasan yang berdiri sendiri \(tetapi karena alasan tertentu tidak /, setidaknya tidak di Chrome.)

(Untuk daftar lengkap, lihat bagian String di sini .)

Misalnya, berikut ini akan memberi Anda pengecualian ini:

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

Jadi itu harus diubah menjadi:

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

Yang, saya harus katakan, membuatnya sangat tidak dapat dibaca dalam format JSON-only dengan jumlah teks yang lebih besar.

c00000fd
sumber
1

Semoga ini bisa membantu orang lain.

Masalah saya adalah bahwa saya telah berkomentar HTML dalam fungsi panggilan balik PHP melalui AJAX yang mem-parsing komentar dan mengembalikan JSON yang tidak valid.

Setelah saya menghapus HTML komentar, semuanya baik dan JSON diuraikan tanpa masalah.

Chris
sumber
0

produk adalah array yang dapat digunakan secara langsung:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);
ic3b3rg
sumber
0

Sekarang tampaknya \r, \b, \t,\f , dll tidak chars hanya bermasalah yang dapat memberikan kesalahan ini.

Perhatikan bahwa beberapa browser mungkin memiliki persyaratan tambahan untuk inputJSON.parse .

Jalankan kode tes ini di browser Anda:

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

Menguji di Chrome, saya melihat bahwa itu tidak memungkinkan di JSON.parse(String.fromCharCode(0x22, x, 0x22));mana x34, 92, atau dari 0 hingga 31.

Karakter 34 dan 92 adalah karakter "dan \masing-masing, dan mereka biasanya diharapkan dan lolos dengan benar. Karakter 0 hingga 31 yang akan memberi Anda masalah.

Untuk membantu debug, sebelum Anda melakukannya JSON.parse(input), pertama-tama verifikasi bahwa input tidak mengandung karakter yang bermasalah:

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;
        }
    }
}
Pacerier
sumber
0

Mengapa Anda membutuhkan JSON.parse? Sudah dalam array format objek.

Lebih baik gunakan JSON.stringify seperti di bawah ini: var b = JSON.stringify(products);

Ini dapat membantu Anda.

abhijit padhy
sumber
0

Oh man, solusi dalam semua jawaban di atas yang diberikan sejauh ini tidak berhasil untuk saya. Saya punya masalah yang sama tadi. Saya berhasil menyelesaikannya dengan membungkusnya dengan kutipan. Lihat tangkapan layar. Whoo

masukkan deskripsi gambar di sini

Asli:

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

Baiklah Smith
sumber
0

Kesalahan yang Anda dapatkan yaitu "token o yang tidak terduga" adalah karena json diharapkan tetapi objek diperoleh saat parsing. "O" itu adalah huruf pertama dari kata "objek".

Shashank Bodkhe
sumber
0

Satu-satunya kesalahan yang Anda lakukan adalah, Anda mem-parsing objek yang sudah di-parsing jadi itu kesalahan melempar, gunakan ini dan Anda akan baik untuk pergi.

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

jika Anda ingin mencetak seluruh json maka gunakan JSON.stringify ()

Kiran Maniya
sumber
0

Ini bisa terjadi karena banyak alasan, tetapi mungkin untuk char yang tidak valid, jadi Anda bisa menggunakannya JSON.stringify(obj);yang akan mengubah objek Anda menjadi JSON tetapi ingat bahwa itu adalah ekspresi JQUERY.

Elvis Silva Noleto
sumber
0

Saya memiliki kesalahan ini KARENA API yang mengembalikan objek json memberi AN ERROR (dalam kasus saya Penyala Kode, kembalikan html ketika kode php gagal) jadi INI BUKAN OBYEK JSON.

Periksa Kalimat SQL dan kode PHP, dan mengujinya dengan tukang pos (atau beberapa tester API lainnya)

Ari Waisberg
sumber
0

Kesalahan yang saya lakukan adalah melewatinya null (tanpa sadar) ke JSON.parse ().

Jadi itu melempar Unexpected token n in JSON at position 0

Aashutosh Rathi
sumber
-24

Gunakan eval. Dibutuhkan ekspresi / kode JavaScript sebagai string dan mengevaluasi / mengeksekusinya.

eval(inputString);
Kasthuri
sumber
Setiap doa eval () membuat instance baru dari penerjemah JavaScript. Ini bisa menjadi sumber daya babi.
Yëco