चेतावनी: तरीकों पर भरोसा करने के लिए JSON.parse
- ऐरे और उद्धरण घिरे तार भी (यानी।console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)
सभी गैर-वस्तु JSON प्राइमेटिव (बूलियन, नल, सरणी, संख्या, स्ट्रिंग) से बचने के लिए, मैं निम्नलिखित का उपयोग करने का सुझाव देता हूं:
/* 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
}
}
कोड स्पष्टीकरण
- !! ओ - मिथ्या नहीं है (अशक्त को छोड़कर, जो टाइपोफ 'ऑब्जेक्ट' के रूप में पंजीकृत है)
- (टाइपऑफ ओ === 'ऑब्जेक्ट') - बूलियन, संख्या और स्ट्रिंग को छोड़ देता है
- Array.isArray (o) - सरणियों को छोड़ दें (जो टाइपोफ़ 'ऑब्जेक्ट' के रूप में पंजीकृत हैं)
- प्रयास करें ... JSON.stringify / JSON.parse - मान्य JSON का निर्धारण करने के लिए जावास्क्रिप्ट इंजन पूछता है
HasJsonStructure () उत्तर का उपयोग क्यों नहीं करें?
पर भरोसा toString()
अच्छा विचार नहीं है। ऐसा इसलिए है क्योंकि विभिन्न जावास्क्रिप्ट इंजन एक अलग स्ट्रिंग प्रतिनिधित्व लौटा सकते हैं। सामान्य तौर पर, इस पर निर्भर करने वाले तरीके अलग-अलग वातावरण में विफल हो सकते हैं या बाद में विफल हो सकते हैं, इंजन को कभी स्ट्रिंग परिणाम बदलना चाहिए
एक अपवाद हैक क्यों नहीं पकड़ रहा है?
यह लाया गया था कि किसी चीज की वैधता का निर्धारण करने के लिए अपवाद को पकड़ना कभी भी सही रास्ता नहीं है। यह आमतौर पर अच्छी सलाह है, लेकिन हमेशा नहीं। इस मामले में, अपवाद को पकड़ने की संभावना सबसे अच्छा मार्ग है क्योंकि यह जावास्क्रिप्ट इंजन को JSON डेटा को मान्य करने के कार्यान्वयन पर निर्भर करता है।
जेएस इंजन पर भरोसा करने से निम्नलिखित लाभ मिलते हैं:
- JSON कल्पना में परिवर्तन के रूप में अधिक गहन और लगातार अप-टू-डेट
- तेजी से चलाने के लिए संभव है (क्योंकि यह निचले स्तर का कोड है)
जब जावास्क्रिप्ट इंजन पर झुकाव का अवसर दिया जाता है, तो मैं यह करने का सुझाव दूंगा। इस मामले में विशेष रूप से। हालांकि यह एक अपवाद को पकड़ने के लिए हैकी लग सकता है , आप वास्तव में सिर्फ एक बाहरी विधि से दो संभावित रिटर्न स्टेट्स को संभाल रहे हैं।
eval()
अगर यह वापस आता हैundefined
, तो यह JSON नहीं है