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:
/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
Penjelasan Kode
- !! o - Tidak palsu (tidak termasuk null, yang mendaftar sebagai jenis 'objek')
- (typeof o === 'objek') - Tidak termasuk boolean, angka, dan string
- ! Array.isArray (o) - Kecualikan array (yang mendaftar sebagai jenis 'objek')
- coba ... JSON.stringify / JSON.parse - Minta mesin JavaScript untuk menentukan apakah JSON valid
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 string
Mengapa 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:
- Lebih teliti dan terus diperbarui seiring dengan perubahan spesifikasi JSON
- Kemungkinan untuk berjalan lebih cepat (karena ini kode level lebih rendah)
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.
eval()
jika itu kembaliundefined
maka, itu bukan JSON