আজাক্স: একটি স্ট্রিংটি 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.