Saya punya panggilan AJAX sederhana, dan server akan mengembalikan string JSON dengan data yang berguna atau string pesan kesalahan yang dihasilkan oleh fungsi PHP mysql_error()
. Bagaimana saya bisa menguji apakah data ini adalah string JSON atau pesan kesalahan.
Akan menyenangkan untuk menggunakan fungsi yang disebut isJSON
sama seperti Anda dapat menggunakan fungsi instanceof
untuk menguji apakah ada sesuatu yang merupakan Array.
Ini yang aku inginkan:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
javascript
mysql
json
jeffery_the_wind
sumber
sumber
eval()
jika itu kembaliundefined
maka, itu bukan JSONJawaban:
Gunakan JSON.parse
sumber
JSON.parse(1234)
ATAUJSON.parse(0)
ATAUJSON.parse(false)
ATAUJSON.parse(null)
semua tidak akan meningkatkan Pengecualian dan akan kembali benar !!. jangan gunakan jawaban ini1234
,0
,false
, dannull
semua nilai-nilai JSON valid. Jika Anda ingin predikat yang menguji jika JSON mewakili objek, Anda harus melakukan sedikit lagi.JSON.parse
melakukan banyak perhitungan untuk mengurai string, dan memberi Anda objek json jika berhasil, namun Anda membuang hasil yang mungkin ingin digunakan beberapa pengguna. Itu sepertinya tidak baik. Sebaliknya sayareturn {value: JSON.parse(str), valid: true};
dan di blok tangkapreturn {value: str, valid: false};
.. dan saya akan mengubah nama fungsi menjaditryParse()
.Kode ini
JSON.parse(1234)
atauJSON.parse(0)
atauJSON.parse(false)
atauJSON.parse(null)
semuanya akan kembali benar.Jadi saya menulis ulang kode dengan cara ini:
Hasil pengujian:
isJson hasil tes
sumber
return (typeof suspect === "object" && suspect !== null);
Mari kita rekap ini (untuk 2019+).
FAKTA : Nilai-nilai primitif ini adalah JSON-parsable tetapi mereka bukan struktur JSON yang terbentuk dengan baik. Spesifikasi JSON menunjukkan JSON dibangun di atas dua struktur: Kumpulan pasangan nama / nilai (objek) atau daftar nilai yang terurut (array).
FAKTA : Tidak! Sudah pasti legal untuk menggunakan try / catch, terutama dalam kasus seperti ini. Jika tidak, Anda harus melakukan banyak hal analisis string seperti operasi tokenizing / regex; yang akan memiliki kinerja yang buruk.
hasJsonStructure()
Ini berguna jika tujuan Anda adalah untuk memeriksa apakah beberapa data / teks memiliki format pertukaran JSON yang tepat.
Pemakaian:
safeJsonParse()
Dan ini berguna jika Anda ingin berhati-hati saat mengurai beberapa data ke nilai JavaScript.
Pemakaian:
sumber
Jika server merespons dengan JSON maka ia akan memiliki tipe
application/json
konten, jika merespons dengan pesan teks biasa maka ia harus memiliki tipetext/plain
konten. Pastikan server merespons dengan tipe konten yang benar dan mengujinya.sumber
overrideMimeType
dapat menimpa header tipe konten.saat menggunakan
jQuery $.ajax()
respons akan memilikiresponseJSON
properti jika responsnya adalah JSON, ini dapat diperiksa seperti ini:sumber
Saya suka jawaban terbaik tetapi jika itu adalah string kosong mengembalikan benar. Jadi inilah perbaikannya:
sumber
Namun, saya akan menyarankan kepada Anda bahwa panggilan / layanan http Anda harus selalu mengembalikan data dalam format yang sama. Jadi jika Anda memiliki kesalahan, maka Anda harus memiliki objek JSON yang membungkus kesalahan ini:
Dan mungkin menggunakan status HTTP serta kode 5xx.
sumber
Yah ... Itu tergantung cara Anda menerima data Anda. Saya pikir server merespons dengan string yang diformat JSON (menggunakan json_encode () dalam PHP, misalnya). Jika Anda menggunakan posting JQuery dan mengatur data respons menjadi format JSON dan itu adalah JSON yang salah bentuk, ini akan menghasilkan kesalahan:
Tetapi, jika Anda menggunakan respons tipe sebagai teks, Anda perlu menggunakan $ .parseJSON. Menurut situs jquery: "Melewati string JSON yang salah dapat menghasilkan pengecualian yang dilemparkan". Dengan demikian kode Anda akan:
sumber
response
kosong, ia akan menuju kesuccess
: '(Mungkin ada tes yang dapat Anda lakukan, misalnya jika Anda tahu bahwa JSON yang dikembalikan selalu akan dikelilingi oleh
{
dan}
kemudian Anda dapat menguji untuk karakter-karakter itu, atau metode peretasan lainnya. Atau Anda bisa menggunakan pustaka JS json.org untuk mencoba dan menguraikannya dan mengujinya jika berhasil.Namun saya akan menyarankan pendekatan yang berbeda. Skrip PHP Anda saat ini mengembalikan JSON jika panggilan berhasil, tetapi ada yang lain jika tidak. Mengapa tidak selalu mengembalikan JSON?
Misalnya
Panggilan sukses:
Panggilan salah:
Ini akan membuat menulis sisi klien Anda JS jauh lebih mudah - yang harus Anda lakukan adalah memeriksa "status" anggota dan bertindak sesuai.
sumber
Saya hanya menggunakan 2 baris untuk melakukan itu:
Itu saja!
Namun perlu diingat ada 2 jebakan:
1.
JSON.parse(null)
returnnull
2. Semua angka atau string dapat diuraikan dengan
JSON.parse()
metode.JSON.parse("5")
mengembalikan5
JSON.parse(5)
pengembalian5
Mari kita bermain kode:
sumber
[
dan]
. Misalnya,[1, 2, 3]
adalah array angka.["a", "b", "c"]
adalah array string. Dan[{"a":1}, {"b":2}]
merupakan array JSON. Pekerjaan jsfiddle Anda tampaknya sangat berguna!JSON.parse
. Adakah yang bisa menyarankan cara menghindari kesalahan itu tanpa menggunakan coba?jsfiddle
Aplikasi Anda melempar kesalahan karena Tes 3 tidak memiliki ekspresi JSON yang valid. Jadi atry-catch
harus digunakan untuk menangkap kesalahan itu dan untuk mengevaluasi kesalahan karena ekspresi bukan JSON ketika parsing seperti Test 3 di atas:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
Anda dapat mencoba mendekodekannya dan menangkap pengecualian (asli atau json2.js ):
Namun, saya menyarankan agar respons JSON selalu valid. Jika Anda mendapatkan kesalahan kembali dari permintaan MySQL Anda, cukup kirim kembali JSON dengan kesalahan:
Lalu:
sumber
Peringatan: Untuk metode yang mengandalkan
JSON.parse
- Array dan kutipan string yang dikelilingi akan berlalu juga (mis.console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)Untuk menghindari semua primitif JSON non-objek (boolean, null, array, number, string), saya sarankan menggunakan yang berikut ini:
Penjelasan Kode
Mengapa tidak menggunakan jawaban hasJsonStructure ()?
Mengandalkan
toString()
bukan ide yang bagus. Ini karena Mesin JavaScript yang berbeda dapat mengembalikan representasi string yang berbeda. Secara umum, metode yang mengandalkan ini dapat gagal di lingkungan yang berbeda atau dapat mengalami kegagalan nanti jika mesin mengubah hasil stringMengapa menangkap pengecualian bukan peretasan?
Dikatakan bahwa menangkap pengecualian untuk menentukan validitas sesuatu tidak pernah merupakan cara yang tepat untuk dilakukan. Ini umumnya nasihat yang baik, tetapi tidak selalu. Dalam hal ini, penangkapan pengecualian kemungkinan adalah rute terbaik karena bergantung pada implementasi mesin JavaScript dalam memvalidasi data JSON.
Mengandalkan mesin JS menawarkan keuntungan berikut:
Ketika diberi kesempatan untuk bersandar pada mesin JavaScript, saya sarankan melakukannya. Khususnya dalam hal ini. Meskipun mungkin terasa gila untuk menangkap pengecualian, Anda benar-benar hanya menangani dua status pengembalian yang mungkin dari metode eksternal.
sumber
Ini adalah kode dengan sedikit modifikasi dalam jawaban Bourne. Karena JSON.parse (angka) berfungsi dengan baik tanpa kecuali sehingga ditambahkan isNaN.
sumber
Semua string json dimulai dengan '{' atau '[' dan diakhiri dengan '}' atau '] yang sesuai, jadi cukup periksa untuk itu.
Begini cara Angular.js melakukannya:
https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js
sumber
{ someValue }
akan secara otomatis melewati validasi.Saya sarankan dalam mode skrip:
sumber
Saya menggunakan yang ini (semacam campuran jawaban yang berbeda, tapi tetap saja):
sumber
Anda dapat mencoba yang berikut karena ini juga memvalidasi angka, null, string tetapi jawaban yang ditandai di atas tidak berfungsi dengan benar itu hanya perbaikan dari fungsi di atas:
sumber
Selain jawaban sebelumnya, jika Anda perlu memvalidasi format JSON seperti "{}", Anda dapat menggunakan kode berikut:
Contoh penggunaan: