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


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.


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

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 [.


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.


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

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

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

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.


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

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.



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.


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

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

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.


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


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


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


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.


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)


0

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

Jadi itu melempar Unexpected token n in JSON at position 0


-24

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

eval(inputString);

Setiap doa eval () membuat instance baru dari penerjemah JavaScript. Ini bisa menjadi sumber daya babi.
Yëco
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.