Bagaimana cara memeriksa apakah suatu nilai adalah objek json?
101
Kode sisi server saya mengembalikan nilai yang merupakan objek json pada kesuksesan dan string 'false' pada kegagalan. Sekarang bagaimana saya bisa memeriksa apakah nilai yang dikembalikan adalah objek json?
Jika sebenarnya itu adalah kode sisi server "Anda", mengapa tidak memiliki bidang status di hasil JSON daripada membuat situasi "kadang-kadang-JSON-dan-kadang-bukan" ini ...?
HostileFork mengatakan jangan percaya SE
@Hostile Untuk alasan debugging. Anda tidak pernah tahu jenis kegagalan apa yang akan dilemparkan server dan pada saat itu json tidak digunakan.
bart
1
Saya masih tidak melihat bagaimana memiliki kode kesalahan (sebagai bidang bernama) dalam respons server akan merusaknya. Cukup bagus untuk Freebase! wiki.freebase.com/wiki/MQL_errors
HostileFork mengatakan jangan percaya SE
Silakan ubah jawaban yang diterima ke Serguei Federov's, jika Anda bisa, jawaban yang diterima saat ini salah.
Serj Sagan
Apa itu "objek json"? Ada string JSON dan objek JS, tetapi tidak ada yang namanya "objek Notasi Objek JavaScript".
mpen
Jawaban:
105
jQuery.parseJSON () harus mengembalikan objek bertipe "object", jika stringnya adalah JSON, jadi Anda hanya perlu memeriksa jenisnya dengan typeof
var response=jQuery.parseJSON('response from server');if(typeof response =='object'){// It is JSON}else{if(response ===false){// the response was a string "false", parseJSON will convert it to boolean false}else{// the response was something else}}
Mungkin juga perlu menggunakan try / catch untuk pengecualian jika mungkin parseJSON akan berurusan dengan sesuatu selain nilai JSON (yaitu HTML)
acorncom
2
Sebelum jQuery 1.9, $ .parseJSON mengembalikan null alih-alih menampilkan kesalahan jika itu diteruskan string kosong, null, atau tidak ditentukan, meskipun itu bukan JSON yang valid. tautan situs jquery
gloomy.penguin
7
Solusi ini bukan yang terbaik, karena "SyntaxError: JSON.parse: unexpected character"kesalahan pengembalian ! , Saya pikir solusi terbaik adalah menggunakan coba / tangkap yang dikatakan Serguei Fedorovdi sini: stackoverflow.com/questions/4295386/…
Nabi KAZ
2
Jika Anda tidak ingin menggunakan jquery, Anda dapat menggunakan vanilla JS dengan memeriksa tipe konstruktor seperti yang dijelaskan di sini: stackoverflow.com/questions/11182924/…
Mat
2
Jawaban ini salah, jawaban Serguei Federov haruslah jawaban yang diterima.
Serj Sagan
148
Solusi yang dipilih sebenarnya tidak berhasil untuk saya karena saya mendapatkan a
"Unexpected Token <"
kesalahan di Chrome. Ini karena kesalahan dilemparkan segera setelah parse ditemukan dan karakter tidak dikenal. Namun, ada jalan lain jika Anda hanya mengembalikan nilai string melalui ajax (yang bisa sangat berguna jika Anda menggunakan PHP atau ASPX untuk memproses permintaan ajax dan mungkin atau mungkin tidak mengembalikan JSON tergantung pada kondisi)
Solusinya cukup sederhana, Anda dapat melakukan hal berikut untuk memeriksa apakah itu pengembalian JSON yang valid
var IS_JSON =true;try{var json = $.parseJSON(msg);}catch(err){
IS_JSON =false;}
Seperti yang telah saya katakan sebelumnya, ini adalah solusi jika Anda mengembalikan barang jenis string dari permintaan AJAX Anda atau jika Anda mengembalikan jenis campuran.
Pertanyaannya bukanlah tentang string non-JSON dalam hal apa pun. Server selalu mengembalikan JSON yang valid (string falsejuga merupakan JSON yang valid). Pertanyaannya hanya tentang satu titik: bagaimana membedakan jika string JSON yang diuraikan adalah boolean falseatau objek
Dr. Molle
2
Pertimbangan kinerja: Membungkus ini dalam sebuah fungsi, pastikan untuk tidak mengurai json dua kali (sekali di dalam tombol coba, dan sekali dalam kode yang memanggil fungsi tersebut.)
Michiel Cornille
Ini adalah pembantu berfungsi isJSON () yang dapat Anda gunakan: isJSON(someValue).
Jika Anda menggunakan JQuery untuk membawa informasi melalui AJAX. Saya sarankan Anda memasukkan atribut "dataType" dengan nilai "json", dengan cara itu jika Anda mendapatkan JSON atau tidak, JQuery memvalidasinya untuk Anda dan membuatnya dikenal melalui fungsi "berhasil" dan "kesalahan". Contoh:
$.ajax({
url:'http://www.something.com',
data: $('#formId').serialize(),
method:'POST',
dataType:'json',// "sucess" will be executed only if the response status is 200 and get a JSON
success:function(json){},// "error" will run but receive state 200, but if you miss the JSON syntax
error:function(xhr){}});
Jika Anda menggunakan isPlainObject pada string, hasilnya salah, misalnya jQuery.isPlainObject ('{}')
Roy Shoa
Lebih penting lagi, jika ini berisi nilai non-JSON-like sebagai properti, menurut dokumen, fungsi ini akan tetap dikembalikan true.
samvv
6
var checkJSON =function(m){if(typeof m =='object'){try{ m = JSON.stringify(m);}catch(err){returnfalse;}}if(typeof m =='string'){try{ m = JSON.parse(m);}catch(err){returnfalse;}}if(typeof m !='object'){returnfalse;}returntrue;};
checkJSON(JSON.parse('{}'));//true
checkJSON(JSON.parse('{"a":0}'));//true
checkJSON('{}');//true
checkJSON('{"a":0}');//true
checkJSON('x');//false
checkJSON('');//false
checkJSON();//false
Saya tahu utas ini sudah dijawab, tetapi datang ke sini tidak benar-benar menyelesaikan masalah saya, saya menemukan fungsi ini di tempat lain. mungkin seseorang yang datang ke sini akan menganggapnya berguna bagi mereka;
function getClass(obj){if(typeof obj ==="undefined")return"undefined";if(obj ===null)return"null";returnObject.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];}
Jika Anda ingin menguji JSON yang valid secara eksplisit (sebagai lawan dari tidak adanya nilai yang dikembalikan false), Anda dapat menggunakan pendekatan parsing seperti yang dijelaskan di sini .
Saya tidak terlalu suka jawaban yang diterima. Pertama dan terpenting, ini membutuhkan jQuery, yang tidak selalu tersedia atau diperlukan. Kedua, ia melakukan stringifikasi penuh terhadap objek yang menurut saya berlebihan. Berikut adalah fungsi sederhana yang secara menyeluruh mendeteksi apakah suatu nilai mirip JSON, menggunakan tidak lebih dari beberapa bagian pustaka lodash untuk sifat umum .
Saya bahkan telah meluangkan waktu untuk memasangnya di npm sebagai satu paket: https://npmjs.com/package/is-json-object . Gunakan bersama dengan sesuatu seperti Webpack untuk mendapatkannya di browser.
Jawaban:
jQuery.parseJSON () harus mengembalikan objek bertipe "object", jika stringnya adalah JSON, jadi Anda hanya perlu memeriksa jenisnya dengan
typeof
sumber
"SyntaxError: JSON.parse: unexpected character"
kesalahan pengembalian ! , Saya pikir solusi terbaik adalah menggunakan coba / tangkap yang dikatakanSerguei Fedorov
di sini: stackoverflow.com/questions/4295386/…Solusi yang dipilih sebenarnya tidak berhasil untuk saya karena saya mendapatkan a
kesalahan di Chrome. Ini karena kesalahan dilemparkan segera setelah parse ditemukan dan karakter tidak dikenal. Namun, ada jalan lain jika Anda hanya mengembalikan nilai string melalui ajax (yang bisa sangat berguna jika Anda menggunakan PHP atau ASPX untuk memproses permintaan ajax dan mungkin atau mungkin tidak mengembalikan JSON tergantung pada kondisi)
Solusinya cukup sederhana, Anda dapat melakukan hal berikut untuk memeriksa apakah itu pengembalian JSON yang valid
Seperti yang telah saya katakan sebelumnya, ini adalah solusi jika Anda mengembalikan barang jenis string dari permintaan AJAX Anda atau jika Anda mengembalikan jenis campuran.
sumber
false
juga merupakan JSON yang valid). Pertanyaannya hanya tentang satu titik: bagaimana membedakan jika string JSON yang diuraikan adalah booleanfalse
atau objekisJSON(someValue)
.Solusi 3 (cara tercepat)
Anda bisa menggunakannya:
Cara terbaik untuk memvalidasi bahwa suatu objek berjenis JSON atau array adalah sebagai berikut:
Solusi 1
Solusi 2
Namun, secara tegas, array adalah bagian dari sintaks JSON. Oleh karena itu, dua contoh berikut adalah bagian dari respons JSON:
Dan:
AJAX / JQuery (disarankan)
Jika Anda menggunakan JQuery untuk membawa informasi melalui AJAX. Saya sarankan Anda memasukkan atribut "dataType" dengan nilai "json", dengan cara itu jika Anda mendapatkan JSON atau tidak, JQuery memvalidasinya untuk Anda dan membuatnya dikenal melalui fungsi "berhasil" dan "kesalahan". Contoh:
sumber
Jika Anda memiliki jQuery, gunakan isPlainObject .
sumber
true
.sumber
Karena itu hanya objek palsu dan json, mengapa Anda tidak memeriksa apakah itu salah, jika tidak, itu pasti json.
sumber
Saya tahu utas ini sudah dijawab, tetapi datang ke sini tidak benar-benar menyelesaikan masalah saya, saya menemukan fungsi ini di tempat lain. mungkin seseorang yang datang ke sini akan menganggapnya berguna bagi mereka;
sumber
sumber
Jika Anda ingin menguji JSON yang valid secara eksplisit (sebagai lawan dari tidak adanya nilai yang dikembalikan
false
), Anda dapat menggunakan pendekatan parsing seperti yang dijelaskan di sini .sumber
Saya tidak terlalu suka jawaban yang diterima. Pertama dan terpenting, ini membutuhkan jQuery, yang tidak selalu tersedia atau diperlukan. Kedua, ia melakukan stringifikasi penuh terhadap objek yang menurut saya berlebihan. Berikut adalah fungsi sederhana yang secara menyeluruh mendeteksi apakah suatu nilai mirip JSON, menggunakan tidak lebih dari beberapa bagian pustaka lodash untuk sifat umum .
Saya bahkan telah meluangkan waktu untuk memasangnya di npm sebagai satu paket: https://npmjs.com/package/is-json-object . Gunakan bersama dengan sesuatu seperti Webpack untuk mendapatkannya di browser.
Semoga ini bisa membantu seseorang!
sumber
Saya menggunakan ini untuk memvalidasi Objek JSON
Saya menggunakan ini untuk memvalidasi String JSON
sumber
saya mencoba semua jawaban yang disarankan, tidak ada yang berhasil untuk saya, jadi saya harus menggunakan
cangkul yang membantu orang lain mengatasi masalah ini
sumber
Anda harus selalu mengembalikan json , tetapi mengubah statusnya , atau dalam contoh berikut properti ResponseCode :
sumber