Mengatasi 'SyntaxError: Unexpected token < in JSON at position 0'



Kesalahan 'Uncaught SyntaxError: Unexpected token u in JSON at position 0' disebabkan ketika klien diminta untuk mengeksekusi JSON.parse()string yang dimulai dengan ualih alih JSON yang diharapkan. Penyebab mendasar yang paling mungkin adalah kode sisi server yang biasanya mengembalikan JSON tidak berfungsi dan malah mengirim kembali versi undefinedprimitif yang dirangkai (misalnya, dengan mengembalikan variabel sebelum nilainya ditetapkan).

Ini adalah kesalahan penguraian JavaScript umum, tidak dihasilkan oleh server atau aplikasi sisi klien tertentu. Di NetSuite/SuiteCommerce, biasanya karena Anda memiliki fungsi di dalam layanan atau pengontrol layanan yang mengambil data rekaman; fungsi itu kemudian tidak berfungsi dan mengembalikan variabel kosong.

Pesan eror

Mari kita mulai dengan tampilannya. Anda mungkin mendapatkan kesalahan berikut baik di konsol pengembang web Anda, atau, lebih mungkin, di NetSuite melalui log eksekusi aplikasi SSP:

Uncaught SyntaxError: Unexpected token u in JSON at position 0

Isu

Biasanya ini terjadi saat Anda bekerja pada file layanan, di mana Anda menyambung ke NetSuite dan kemudian meminta beberapa data. Ketika berhadapan dengan transmisi ke dan dari toko web, data biasanya dalam bentuk objek. Pada berbagai tahap data ini akan dirangkai (yaitu dikonversi dari objek ke string) atau diuraikan (dikonversi dari string ke objek) dan di sinilah kesalahan ini muncul.

Jika Anda mencoba mengurai sesuatu selain objek, prosesor JavaScript biasanya akan gagal. Saat mengharapkan sebuah objek, itu akan berhenti pada titik yang tepat di mana ia gagal, itulah sebabnya ia akan mengembalikan posisi di mana ia macet. Token yang tidak terduga berarti bahwa ia mengharapkan data, tetapi malah mendapat kata kunci perintah (tetapi kesalahan ini dapat dipicu oleh hal-hal seperti string juga karena cara mereka diperintahkan untuk digunakan).

Jika token tak terduga adalah a udan posisinya 0 (yaitu hal pertama) maka itu berarti ia mencoba mengurai sesuatu yang dimulai dengan u . Dan kata kunci familiar apa dalam JavaScript yang dimulai dengan u ?

undefined

Dengan kata lain, jika Anda mendapatkan pesan kesalahan pada judul posting ini, maka kemungkinan Anda telah memberi tahu prosesor JavaScript untuk menjalankan yang berikut:

JSON.parse(undefined)

Coba ini di konsol pengembang browser Anda untuk melihat apa yang saya maksud.

Menyelesaikan Masalah

Jadi, kita tahu apa yang terjadi. Tapi mengapa itu terjadi? Mari kita lihat beberapa kemungkinan penyebabnya.

Kembali tidak terdefinisi

Sekarang, Anda mungkin belum menyuruhnya untuk kembali secara eksplisit undefinedsehingga kemudian dapat mencoba menguraikannya (mengapa Anda melakukannya?), tetapi kemungkinannya adalah Anda telah memberi tahu model, layanan, atau pengontrol layanan Anda untuk mengembalikan nilai ke frontend dari situs Anda tetapi nilai tersebut belum berhasil diteruskan. Anda telah melakukan sesuatu seperti, "Kembalikan nilai variabel foo" tetapi telah mengacaukannya.

Untuk memeriksa ini, periksa (atau catat!) apa yang Anda kembalikan:

  • Apakah itu sebuah objek?
  • Apakah itu memiliki properti dan sudahkah Anda memanggilnya yang benar-benar ada?
  • Apakah properti tersebut memiliki nilai?
  • Apakah ada kesalahan ketik dalam kode Anda, seperti nama yang salah eja?

Untuk mengilustrasikan ide ini, lihat bahwa mencoba mengurai properti objek yang belum Anda tentukan juga akan mengembalikan kesalahan ini. Sebagai contoh:

var obj = {};
obj.foo;
> undefined

JSON.parse(obj.foo);
> Uncaught SyntaxError: Unexpected token u in JSON at position 0

Jika kode Anda terlihat bagus, ingatlah bahwa ini juga bisa terjadi jika Anda mengembalikan variabel sebelum nilainya (sebuah objek) dihasilkan. Dalam kasus ini, pastikan semua operasi yang diperlukan telah selesai. Misalnya, jika objek Anda akan dibuat setelah janji diselesaikan, pastikan itu telah diselesaikan sebelum diteruskan kembali. Jika janji gagal, pastikan sudah diatur untuk mengembalikan objek yang berisi pesan kesalahan!

Ingat, jika Anda akan mencoba dan mencatat objek ke log aplikasi SSP, Anda harus merangkainya terlebih dahulu, jika tidak, Anda hanya akan masuk [object Object]log.

Mencoba Mengurai String

Pesan kesalahan juga dapat terjadi jika Anda mengembalikan string yang kemudian coba diurai oleh aplikasi seolah-olah itu adalah objek. Pertimbangkan contoh di mana Anda mencoba mengurai string yang dimulai dengan huruf u :

JSON.parse('umbrella')
> Uncaught SyntaxError: Unexpected token u in JSON at position 0

Ada beberapa kesalahan lain yang terlihat mirip dengan yang ini.

Mencoba Mengurai Data Tanpa String

Hal penting lainnya yang perlu diingat adalah bahwa sebelum JSON dapat diuraikan, JSON harus terlebih dahulu dirangkai . Sekarang, pengontrol layanan modern diatur untuk mendeteksi ketika data 'kompleks' sedang dikirim, sehingga secara otomatis akan mencoba merangkai array atau objek yang sedang dikirim kembali. Untuk alasan apa pun, ini mungkin tidak terjadi sehingga Anda perlu melacak bagian tertentu dalam kode Anda dan melihat apa yang terjadi.

Atau, Anda mungkin terbiasa menggunakan pengontrol layanan dan tidak menyadari bahwa Anda perlu melakukan operasi ini secara manual jika Anda menulis file .ss khusus , atau jika Anda menulis sesuatu seperti Suitelet.

Dengan kata lain, Anda mungkin telah mengirim objek Anda kembali dalam bentuk yang baik dan benar, tetapi objek tersebut tidak dirangkai terlebih dahulu, dan bagian penerima dari aplikasi telah diberitahu untuk mengurai respons. Jika mendapatkan kembali objek tanpa string, dan mencoba menguraikannya, itu akan gagal.

Untuk mengilustrasikannya, perhatikan contoh ini:

// Create my response object
var obj = {message: 'Hello!'}
obj.message
> "Hello!"

// Send the content back, eg:
// this.sendContent(obj)

// Receive the content and automatically attempt to parse it
JSON.parse(obj)
> Uncaught SyntaxError: Unexpected token o in JSON at position 1
// Note that the error is slightly different in content, but generally the same problem

// In reality, this is the shorthand for what should be happening
JSON.parse(JSON.stringify(obj))
> {message: "Hello!"}

Mencoba Mengurai Dokumen HTML

Dalam beberapa kasus, halaman kesalahan HTML lengkap dibuat dan dikirim kembali alih-alih nilai yang diinginkan. Ketika ini terjadi, Anda akan melihat sesuatu seperti ini:

Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

Biasanya ada alasan yang sangat spesifik mengapa ini terjadi, itu tergantung pada keadaan Anda. Namun, secara umum: Anda telah mencoba meminta sesuatu, server gagal, dan, alih-alih mengembalikan objek, itu menghasilkan halaman kesalahan HTML lengkap dan mengirimkannya kembali. Alasan mengapa ada <karakter di awal adalah karena selalu karakter pertama di sumber halaman HTML. Dalam kebanyakan kasus, itu akan menjadi <!DOCTYPE html>.

Oleh karena itu, jika Anda ingin memecahkan masalah kesalahan ini, lihat tab Jaringan browser Anda di alat pengembang dan lihat halaman apa yang dikirimkan kembali kepada Anda. Biasanya akan ada pesan kesalahan di badan HTML.

Kiat Bonus: Menggunakan Metode JSON untuk Menyalin Objek

Akhirnya, tip menyenangkan yang berhubungan dengan JSON.parse()dan JSON.stringify(): jika Anda pernah ingin menyalin objek secara mendalam sehingga nilai objek disalin ke objek baru dengan nilai daripada referensi , Anda dapat menggunakan JSON.parse(JSON.stringify(obj)), di mana objobjek Anda.

Sebagai catatan, Anda harus menggunakan _.deepCopy()metode bawaan kami di hampir semua kasus karena kami memperhitungkan situasi tertentu di mana menyalin objek secara mendalam dapat menjadi masalah (seperti dengan model Backbone).

Bagaimanapun, apa yang dilakukan stringifikasi dan penguraian segera adalah mengubah objek menjadi string, sehingga mengubah properti dan nilai-nilai yang diselesaikan dari seluruh objek menjadi string (dan karenanya mengakhiri koneksi pointer mereka) dan kemudian mengubahnya kembali menjadi objek yang Anda bisa menggunakan. Ini bisa sangat membantu ketika Anda ingin membuat salinan objek seperti pada saat itu :

// Create two objects, one which is a copy of it by reference
var obj1 = {message: 'Hello!'}
var obj2 = obj1

// Are they the same?
obj1.message == obj2.message
> true

// At the moment, they are linked by reference, so changing a value in one will change a value in another
obj2.message
> "Hello!"

obj1.message = 'Goodbye!'
obj2.message
> "Goodbye!"

// OK, but what we stringify and then parse one object's values and reassign it?
obj2 = JSON.parse(JSON.stringify(obj1))
obj2.message = 'Hello!'

// They are no longer identical! (This is very useful for large objects!)
obj1.message
> "Goodbye!"
obj2.message
> "Hello!"

Dari perspektif kinerja, ini sebenarnya cukup cepat, dan tentu saja menghemat kerumitan menulis loop.

Related Posts

Subscribe Our Newsletter