Sesuatu seperti:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
Solusinya tidak boleh mengandung try / catch. Beberapa dari kita mengaktifkan "break on all errors" dan mereka tidak suka debugger memecahkan string JSON yang tidak valid itu.
javascript
json
Chi Chan
sumber
sumber
try
?Jawaban:
Komentar dulu. Pertanyaannya adalah tentang tidak menggunakan
try/catch
.Jika Anda tidak keberatan menggunakannya, baca jawaban di bawah ini. Di sini kita hanya memeriksa
JSON
string menggunakan regexp, dan itu akan berfungsi dalam kebanyakan kasus, tidak semua kasus.Lihat garis 450 di https://github.com/douglascrockford/JSON-js/blob/master/json2.js
Ada regexp yang memeriksa JSON yang valid, seperti:
EDIT : Versi baru json2.js membuat penguraian lebih maju daripada di atas, tetapi masih didasarkan pada penggantian regexp (dari komentar @Mrchief )
sumber
Gunakan parser JSON seperti
JSON.parse
:sumber
JSON.parse("false")
mengevaluasi ke false juga.Saya tahu saya terlambat 3 tahun untuk pertanyaan ini, tetapi saya merasa ingin berdebat.
Meskipun solusi Gumbo bekerja sangat baik, solusi ini tidak menangani beberapa kasus di mana tidak ada pengecualian yang muncul
JSON.parse({something that isn't JSON})
Saya juga lebih suka mengembalikan JSON yang diuraikan pada saat yang sama, sehingga kode panggilan tidak harus memanggil
JSON.parse(jsonString)
yang kedua kalinya.Ini sepertinya bekerja dengan baik untuk kebutuhan saya:
sumber
o && o !== null
berlebihan.undefined
, bukanfalse
karenafalse
string json yang valid dan tidak ada cara untuk membedakan antaratryParseJSON("false")
dantryParseJSON("garbage")
Penggunaan:
isJSON({})
akanfalse
,isJSON('{}')
akantrue
.Untuk memeriksa apakah ada sesuatu
Array
atauObject
( parsing JSON):Penggunaan:
isAO({})
akantrue
,isAO('{}')
akanfalse
.sumber
null
melewati validasi ini.return !!(JSON.parse(str) && str);
harus memblokir nilai nol. Saya akan memperbarui jawabannya dengan kode ini.parse()
tes, menyebabkan WTF.Di sini kode kerja saya:
sumber
typeof str === 'string'
Saya menggunakan metode yang sangat sederhana untuk memeriksa string bagaimana JSON yang valid atau tidak.
Hasil dengan string JSON yang valid:
Hasil dengan string sederhana;
Hasil dengan objek:
Hasil dengan input nol:
Yang terakhir mengembalikan false karena jenis variabel nol adalah objek.
Ini berfungsi setiap saat. :)
sumber
null
input itu memberikan kembali salah. Tetapi input "false" adalah string JSON yang valid. Ini akan diuraikan menjadiboolean (false)
. Sekarang saya memodifikasi kodenya menjadi lebih akurat.Dalam prototipeJS, kami memiliki metode isJSON . Anda bisa mencobanya. Bahkan json mungkin bisa membantu.
sumber
"{ foo: 42 }".isJSON()
? Jikafalse
, seperti yang saya asumsikan (hasil harus mengikuti fungsinya mendokumentasikan), maka pertanyaan yang bagus adalah, mengapa itu salah?{ foo: 42 }
tampaknya JSON yang benar-benar valid.Dari
String.isJSON
definisi kerangka kerja Prototipe di sinijadi ini adalah versi yang bisa digunakan lewat objek string
sumber
Saya menggunakan JQuery untuk mem-parsing string JSON dan saya menggunakan pernyataan trycatch untuk menangani pengecualian, tetapi melempar pengecualian untuk string un-parsable memperlambat kode saya, jadi saya menggunakan Regex sederhana untuk memeriksa string jika itu adalah string JSON yang mungkin atau tidak tanpa menjadi bulu. dengan memeriksa sintaksnya, maka saya menggunakan cara biasa dengan mem-parsing string menggunakan JQuery:
sumber
Mungkin ini akan berguna:
keluaran:
IE7: string , objek, string, string
CHROME: objek, objek, string, string
sumber
Saya rasa saya tahu mengapa Anda ingin menghindarinya. Tapi mungkin coba & tangkap! == coba & tangkap. ; o) Ini muncul di benak saya:
Jadi, Anda juga dapat mengotori klip ke objek JSON, seperti:
Karena ini sebagai encapsuled mungkin, itu tidak dapat rusak karena kesalahan.
sumber
Ini juga versi naskahnya:
sumber
sumber
Saya menyimpulkan dari komentar pembukaan bahwa use case menggambarkan apakah suatu respons adalah HTML atau JSON. Dalam hal ini, ketika Anda melakukan menerima JSON, Anda mungkin seharusnya parsing dan penanganan JSON tidak valid di beberapa titik dalam kode Anda tetap. Selain dari apa pun, saya bayangkan Anda ingin diinformasikan oleh browser Anda jika JSON diharapkan tetapi JSON tidak valid diterima (seperti halnya pengguna dengan proksi dari beberapa pesan kesalahan yang berarti)!
Oleh karena itu, melakukan regex penuh untuk JSON tidak perlu (seperti yang akan - menurut pengalaman saya - untuk sebagian besar kasus penggunaan). Anda mungkin akan lebih baik menggunakan sesuatu seperti di bawah ini:
yang akan menyelamatkan Anda dari pengecualian menangani kode non-JSON yang valid dan mengurus duff json pada saat yang sama.
sumber
Saya harap ini juga bekerja untuk Anda
sumber
Jika ada kesalahan, kembalikan salah.
Jika tidak ada kesalahan, kembalikan data json
sumber
Anda dapat menggunakan fungsi javascript eval () untuk memverifikasi apakah itu valid.
misalnya
Atau, Anda dapat menggunakan
JSON.parse
fungsi dari json.org :Semoga ini membantu.
PERINGATAN :
eval()
ini berbahaya jika seseorang menambahkan kode JS berbahaya, karena akan melaksanakannya. Pastikan String JSON dapat dipercaya , yaitu Anda mendapatkannya dari sumber tepercaya.Sunting Untuk solusi pertama saya, disarankan untuk melakukan ini.
Untuk menjamin ketidaknyamanan. Jika
jsonString
JSON tidak murni, eval akan mengeluarkan pengecualian.sumber
Oh, Anda pasti dapat menggunakan try catch untuk memeriksa apakah JSONnya valid atau tidak
Diuji pada Firfox Quantom 60.0.1
gunakan fungsi di dalam fungsi untuk mendapatkan JSON diuji dan gunakan output itu untuk memvalidasi string. mendengar contoh.
sumber
Fungsi
IsJsonString(str)
, yang menggunakanJSON.parse(str)
, tidak berfungsi dalam kasus saya.Saya mencoba untuk memvalidasi output json dari GraphiQL selalu mengembalikan false. Beruntung saya, isJSON bekerja lebih baik:
Output sampel:
sumber
Untuk orang-orang yang menyukai konvensi .Net dari fungsi "coba" yang mengembalikan boolean dan menangani parameter byref yang berisi hasilnya. Jika Anda tidak membutuhkan parameter keluar, Anda dapat menghilangkannya dan hanya menggunakan nilai balik.
StringTests.js
StringUtils.js
ObjectUtils.js
sumber
Kode one-liner yang sangat sederhana (pendekatan But Hacky)
sumber