আজাক্স: একটি স্ট্রিংটি JSON কিনা তা পরীক্ষা করে দেখুন?


83

আমার জাভাস্ক্রিপ্ট কখনও কখনও এই লাইনে ক্রাশ হয়:

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

যুক্তিটি eval()JSON না হলে ক্রাশ হয়। এই কল করার আগে স্ট্রিংটি JSON কিনা তা পরীক্ষা করার কোনও উপায় আছে?

আমি কোনও কাঠামো ব্যবহার করতে চাই না - এই কাজটি স্রেফ ব্যবহার করে করার কোনও উপায় আছে eval()কি? (আমি একটি প্রতিশ্রুতি আছে একটি ভাল কারণ আছে।)


আপনি JSON.parse () কে চেষ্টা / ধরার চেষ্টা করতে পারেন ... আপনি যদি ধরেন, এটি বৈধ JSON মার্কআপ নয়। অবশ্যই, অকার্যকর, হ্যাঁ ... আপনি আমাকে যে অবৈধ JSON মার্কআপ পাচ্ছেন তার একটি উদাহরণ দিতে পারেন?
ওয়ার্টি

উত্তর:


158

যদি আপনি json.org থেকে জেএসএন পার্সার অন্তর্ভুক্ত করেন তবে আপনি এর পার্স () ফাংশনটি ব্যবহার করতে পারেন এবং কেবল এটির মতো চেষ্টা / ধরাতে মোড়ানো করতে পারেন:

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

এরকম কিছু সম্ভবত আপনি যা চান তা করতে পারে।


9
jQuery.parseJSON (..) ব্যবহার করে আপনাকে json.org
রায়লভলেস

4
@ রেমো ওপি jQuery এবং json2.js jQuery এর অর্ধেকের চেয়ে কম ফাইল (ফাইলের আকারের ক্ষেত্রে) ব্যবহার করার কথা উল্লেখ করেনি।
ব্রেটকেলে

একটি সম্পূর্ণ পংক্তি পার্সিং খারাপ অভ্যাস, এবং একটি ব্যতিক্রম নিক্ষেপ ল্যাগ সৃষ্টি করতে পারে
স্মৃতিভারাতুর

আপনি যদি একটি নম্বর স্ট্রিং প্রেরণ করেন তবে এটি ব্যতিক্রম হবে না
হেশাম ইয়াসিন


16

আমি আপনাকে জেএসএন থেকে সিরিয়ালালাইজ করার জন্য একটি জাভাস্ক্রিপ্ট জেএসএন লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি । eval()এটি একটি সুরক্ষা ঝুঁকি যা কখনই ব্যবহার করা উচিত নয় যদি না আপনি নিশ্চিত হন যে এর ইনপুটটি স্যানিটাইজড এবং নিরাপদ।

জায়গায় কোনও জেএসওএন লাইব্রেরি সহ, parse()নন-জেএসএন ইনপুট হ্যান্ডেল করার জন্য কেবল কলটি তার সমতুল্য / চেষ্টা-ব্লকে মোড়ক করুন:

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>


একই ফলাফল অর্জনের জন্য অনেকগুলি বিকল্প উপায় রয়েছে, সম্ভবত ইভাল () ব্যবহার করা সবচেয়ে কম উপযুক্ত।
ডেভিড

1

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;

স্ক্রিন 1


-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


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.