Uyarı: Güvenilen yöntemler için JSON.parse
- Diziler ve tırnak içine alınmış dizeler de geçecektir (ör. console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)
Nesne olmayan tüm JSON ilkellerinden (boolean, null, dizi, sayı, dize) kaçınmak için aşağıdakileri kullanmanızı öneririm:
/* 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
}
}
Kod Açıklaması
- !! o - Yanlış değil ('nesne' türünü kaydeden null değeri hariç)
- (typeof o === 'object') - Boole, sayı ve dizeyi hariç tutar
- ! Array.isArray (o) - Dizileri hariç tut ('nesne' typeof olarak kaydedilir)
- deneyin ... JSON.stringify / JSON.parse - JavaScript motorundan geçerli JSON olup olmadığını belirlemesini ister
Neden hasJsonStructure () yanıtını kullanmıyorsunuz?
Güvenen toString()
iyi bir fikir değil. Bunun nedeni, farklı JavaScript Motorlarının farklı bir dize gösterimi döndürebilmesidir. Genel olarak, buna güvenen yöntemler farklı ortamlarda başarısız olabilir veya motor dize sonucunu değiştirirse daha sonra başarısız olabilir.
Neden bir istisna yakalamak bir hack değil?
Bir şeyin geçerliliğini belirlemek için bir istisna yakalamak asla doğru yol değildir. Bu genellikle iyi bir tavsiye, ama her zaman değil. Bu durumda, JavaScript motorunun JSON verilerini doğrulama uygulamasına dayandığından istisna yakalama muhtemelen en iyi yoldur.
JS motoruna güvenmek aşağıdaki avantajları sunar:
- JSON spesifikasyonu değiştikçe daha kapsamlı ve sürekli güncel
- Daha hızlı çalışma olasılığı (daha düşük seviye kodu olduğu için)
JavaScript motoruna yaslanma fırsatı verildiğinde, bunu yapmanızı öneririm. Özellikle bu durumda. O olsa da hissetmek bir istisna yakalamak için hacky, gerçekten sadece harici yönteminden iki olası dönüş durumlarını hallediyoruz.
eval()
o zaman dönerse kullanmakundefined
JSON değil