AJAX: जांचें कि क्या स्ट्रिंग JSON है?


83

मेरा जावास्क्रिप्ट कभी-कभी इस लाइन पर दुर्घटनाग्रस्त हो जाता है:

var json = eval('(' + this.responseText + ')');

जब eval()JSON का तर्क नहीं होता है तो दुर्घटनाएँ होती हैं । क्या यह कॉल करने से पहले यह जांचने का कोई तरीका है कि स्ट्रिंग JSON है या नहीं?

मैं एक ढांचे का उपयोग नहीं करना चाहता हूं - क्या इस काम को सिर्फ बनाने का कोई तरीका है eval()? (एक अच्छा कारण है, मैं वादा करता हूँ।)


आप एक कोशिश / पकड़ में JSON.parse () के लिए प्रयास कर सकते हैं ... यदि आपको पकड़ना है, तो इसका वैध JSON मार्कअप नहीं है। बेशक, Thats अक्षम अक्षम, हे ... क्या आप मुझे अवैध JSON मार्कअप का एक उदाहरण दे सकते हैं?
वार्टी

जवाबों:


157

यदि आप jSON.org से JSON पार्सर को शामिल करते हैं , तो आप इसके पार्स () फ़ंक्शन का उपयोग कर सकते हैं और इसे केवल कोशिश / कैच में लपेट सकते हैं, जैसे:

try
{
   var json = JSON.parse(this.responseText);
}
catch(e)
{
   alert('invalid json');
}

ऐसा कुछ जो आप शायद चाहते हैं।


9
jQuery.parseJSON (..) का उपयोग करके आपको json.org शामिल करने की आवश्यकता नहीं होगी
RayLoveless

1
@Raymo OP ने jQuery और json2.js का उपयोग करते हुए आधे से कम jQuery (फ़ाइल आकार के संदर्भ में) का उल्लेख नहीं किया।
ब्रेटकेली

एक पूरी स्ट्रिंग को खराब करना एक बुरा अभ्यास है, और एक अपवाद को फेंकने का कारण हो सकता है
redolent

यदि आप संख्या स्ट्रिंग भेजते हैं तो यह अपवाद नहीं
फेंकेगा

21

हैर्स jQuery विकल्प ...

try
{
  var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
  // handle error 
}

15

मैं अत्यधिक अनुशंसा करता हूं कि आप JSON से और इसके लिए क्रमबद्ध करने के लिए एक जावास्क्रिप्ट JSON लाइब्रेरी का उपयोग करें । eval()एक सुरक्षा जोखिम है जिसे कभी भी उपयोग नहीं किया जाना चाहिए जब तक कि आप पूरी तरह से निश्चित न हों कि इसका इनपुट सुरक्षित और सुरक्षित है।

जगह में JSON लाइब्रेरी के साथ, parse()गैर-JSON इनपुट को संभालने के लिए कॉल को एक कोशिश / कैच-ब्लॉक में इसके समकक्ष लपेटें :

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}

2

शायद यह मदद करता है: इस कोड के साथ, आप सीधे अपना डेटा प्राप्त कर सकते हैं ...

<!DOCTYPE html>
<html>
<body>

<h3>Open console, please, to view result!</h3>
<p id="demo"></p>

<script>
var tryJSON = function (test) {
	try {
	    JSON.parse(test);
	}
	catch(err) {
    	// maybe you need to escape this… (or not)
	    test = '"'+test.replace(/\\?"/g,'\\"')+'"';
	}
	eval('test = '+test);
	console.debug('Try json:', test);
};

// test with string…
var test = 'bonjour "mister"';
tryJSON(test);
// test with JSON…
var test = '{"fr-FR": "<p>Ceci est un texte en français !</p>","en-GB": "<p>And here, a text in english!</p>","nl-NL": "","es-ES": ""}';
tryJSON(test);
</script>

</body>
</html>


एक ही परिणाम प्राप्त करने के लिए बहुत सारे वैकल्पिक तरीके हैं, eval () का उपयोग करना संभवतः सबसे कम उपयुक्त है।
डेविड

0

try-catchदृष्टिकोण के आधार पर समस्या JSON.parse('123') = 123यह है कि यह अपवाद नहीं करेगा। इसलिए, इसके अलावा try-catch, हमें निम्न प्रकार की जांच करने की आवश्यकता है:

function isJsonStr(str) {
    var parsedStr = str;
    try {
        parsedStr = JSON.parse(str);
    } catch (e) {
        return false;
    }
    return typeof parsedStr == 'object'
}

0

आप केवल जाँच क्यों नहीं कर सकते कि प्रतिक्रिया क्या है? यह अधिक कुशल है।

var result;

if (response.headers['Content-Type'] === 'application/json')
    result = JSON.parse(this.responseText);
else
    result = this.responseText;

screen1


-1

एक छोटा पुस्तकालय है जो जावास्क्रिप्ट प्रकारों की जाँच करता है: is.js

is.json({foo: 'bar'});
=> true

// functions are returning as false
is.json(toString);
=> false

is.not.json([]);
=> true

is.all.json({}, 1);
=> false

is.any.json({}, 2);
=> true

// 'all' and 'any' interfaces can also take array parameter
is.all.json([{}, {foo: 'bar'}]);
=> true

असल में is.js बहुत अधिक तो यह है, कुछ माननीय उल्लेख है:

var obj = document.createElement('div');
is.domNode(obj);
=> true

is.error(new Error());
=> true

is.function(toString);
=> true

is.chrome();
=> true if current browser is chrome


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.