জাভাস্ক্রিপ্টে স্ট্রিংটি বৈধ জেএসএন স্ট্রিং কিনা তা চেষ্টা করে দেখুন / চেষ্টা করুন


548

কিছুটা এইরকম:

var jsonString = '{ "Id": 1, "Name": "Coke" }';

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")

সমাধানটিতে চেষ্টা / ধরা থাকা উচিত নয়। আমাদের মধ্যে কিছু "সমস্ত ত্রুটি বিরতি" চালু করে এবং তারা invalid অবৈধ জেএসএন স্ট্রিংগুলিতে ডিবাগার ব্রেকিং পছন্দ করে না।


25
ব্যবহার না করার কোন বৈধ কারণ আছে try?
নিক টি

7
@ নিকটি কারণ আপনি যদি ডিবাগারে "সমস্ত ত্রুটি বিভক্ত" চালু করেন, এটি হবে। ক্রোমের কাছে এখন অনাবৃত ত্রুটিগুলি ভাঙ্গার বিকল্প রয়েছে।
চি চ্যান

6
ধরার চেষ্টা করে এটি পরীক্ষা করতে মাত্র 2 টি লাইন ব্যবহার করুন। var isValidJSON = সত্য; চেষ্টা করুন {JSON.parse (jsonString)} ক্যাচ {isValidJSON = মিথ্যা; }
এফকান

18
এটি যখন কাজ করে, এটি মারাত্মকভাবে ক্লোডি এবং খারাপ অভ্যাস। চেষ্টা / ধরা ব্যতিক্রমী আচরণ এবং ত্রুটি পরিচালনার জন্য বোঝানো হয়, সাধারণ প্রোগ্রাম প্রবাহ নয়।
তাসগল

7
@ টাসগল একটি সাধারণ নিয়ম হিসাবে, হ্যাঁ। তবে চেষ্টা / ধরার পদ্ধতির কোনও বৈধতা-ভিত্তিক পদ্ধতির চেয়ে পারফরম্যান্ট হলে আপনি কী করবেন? বিকল্পটি "খারাপ অনুশীলন" বলেই ধীরে ধীরে (কখনও কখনও উল্লেখযোগ্যভাবে) বিকল্পটি দিয়ে যান? চেষ্টা / ধরার পদ্ধতিতে কার্যত কোনও ভুল নেই, তাই এটি ব্যবহার না করার কোনও কারণ নেই। নতুন প্রোগ্রামারদের ভাল কোডিং মান বিকাশ করা গুরুত্বপূর্ণ, তবে প্রচলিত নির্দেশিকাগুলির অন্ধ অনুসরনকে আরও শক্তিশালী করা না সমান গুরুত্বপূর্ণ, বিশেষত এমন ক্ষেত্রে যেখানে গাইডলাইনগুলি তাদের প্রয়োজনের তুলনায় আরও জটিল করে তোলে।
Abion47

উত্তর:


172

প্রথমে একটি মন্তব্য। প্রশ্নটি ব্যবহার না করার বিষয়ে ছিল try/catch
যদি এটি ব্যবহার করতে আপনার আপত্তি নেই তবে নীচের উত্তরটি পড়ুন। এখানে আমরা কেবল JSONএকটি রেজিএক্সপ্যাক্স ব্যবহার করে একটি স্ট্রিং পরীক্ষা করি এবং এটি বেশিরভাগ ক্ষেত্রেই কাজ করবে, সমস্ত ক্ষেত্রে নয়।

Https://github.com/douglascrockford/JSON-js/blob/master/json2.js এ 450 লাইনটি ঘুরে দেখুন

বৈধ জেএসওএন যাচাই করার জন্য একটি রেজিপ্সপ রয়েছে, এরকম কিছু:

if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

  //the json is ok

}else{

  //the json is not ok

}

সম্পাদনা : json2.js এর নতুন সংস্করণ উপরের তুলনায় আরও উন্নত পার্সিং তৈরি করে, তবে এখনও একটি রেজিএক্সপ্লেস প্রতিস্থাপনের উপর ভিত্তি করে ( @ মিছিচের মন্তব্য থেকে )


59
কোডটি ব্যবহারের জন্য নিরাপদ কিনা তা কেবল এটি পরীক্ষা করছে। উদাহরণস্বরূপ, নিম্নলিখিত স্ট্রিং '2011-6-27' সেই পরীক্ষায় পাস করবে।
সিস্টেমেমিকালিউরাল

4
@ সিস্টেমেপ্লিউরাল, হ্যাঁ তবে প্রশ্নটি চেষ্টা / ধরা ব্যবহার না করার বিষয়ে ছিল
মাইক

8
জাভাস্ক্রিপ্টে একটি স্ট্রিংটি একটি রেজেক্সের সাথে বৈধ JSON বৈধ কিনা তা আপনি পরীক্ষা করতে পারবেন না, যেহেতু জেএস রেজিক্সগুলি প্রয়োজনীয় এক্সটেনশনগুলি (পুনরাবৃত্তকারী রেজেক্সেস) সমর্থন করে না যা আপনাকে এটি করতে দেয়। আপনার উপরের কোডটি "{" এ ব্যর্থ।
ভেনজে

2
@ মিক জসন ২.জেএস আর সেই সহজ চেক ব্যবহার করে না (পরিবর্তে বৈধ জেএসএন নির্ধারণের জন্য একটি 4 পর্যায়ের পার্সিং ব্যবহার করে)। আপনার উত্তরটি সংশোধন বা সরিয়ে দেওয়ার পরামর্শ দিবে। দ্রষ্টব্য যে আমি মনে করি না যে "জেএসওএন-এর জন্য চেক করার একমাত্র প্রক্রিয়া হিসাবে চেষ্টা / ধরার চেষ্টা" না করার ক্ষেত্রে কোনও মতামতই ভুল আছে।
মিচিফ

8
কেবল কারণ এটি তাকে সহায়তা করে, তার অর্থ এই নয় যে এটি আমাদের বাকী অংশগুলিকে সাহায্য করে, যারা বছর পরে, একই প্রশ্ন।
ম্যাককে

916

একটি JSON পার্সার ব্যবহার করুন JSON.parse:

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

7
আপনাকে ধন্যবাদ, তবে আমি এই দলের সাথেই এটি চালিয়েছি এবং তারা এমন কিছু চায় যা চেষ্টা / ধরা ব্যবহার করে না। প্রশ্নটি একটি নতুন শিরোনাম সহ সম্পাদনা করা হয়। এর জন্যে দুঃখিত.
চি চান

4
@ ট্রেজেদার: এটি এমনটি কারণ যে 1 টি স্ট্রিং নয়, "1" দিয়ে চেষ্টা করুন
শুদ্ধফান

31
@ গম্বো আমার মন্তব্যটি 1,5 বছরের পুরানো! :] আমার মনে নেই, আমি দু'সপ্তাহ আগে কী করছিলাম এবং আপনি আমাকে সেই প্রকল্পটি প্রত্যাহার করতে বলেছিলেন? :] না, উপায় ...:]
ট্রেজার্ড

9
এই উত্তরের সমস্যাটি হ'ল, যদি স্ট্রিংটি চেক আউট করে এবং আপনি এটি বিশ্লেষণ করেন তবে আপনি এটি দুবার পার্স করতে পারবেন। আপনি কি পরিবর্তে কোনও খারাপ পার্সে মিথ্যা ফিরিয়ে দিতে পারেন না, তবে সাফল্যের সাথে বস্তুটি ফেরত দিতে পারেন?
কারসিজেনিকেট

5
আপনি এটি করতে পারেন তবে, মিথ্যা হিসাবেও JSON.parse("false")মূল্যায়ন করে ।
গম্বো

445

আমি জানি আমি এই প্রশ্নে 3 বছর দেরি করে ফেলেছি, তবে আমার মনে হয়েছে এটি imুকে পড়েছে।

গাম্বোর সমাধানটি দুর্দান্ত কাজ করার পরে, এটি কয়েকটি ক্ষেত্রে হ্যান্ডেল করে না যেখানে ব্যতিক্রম ব্যতীত হয় না JSON.parse({something that isn't JSON})

আমি একই সাথে পার্সড জেএসওনকে ফিরিয়ে দিতে পছন্দ করি, যাতে কলিং কোডটি JSON.parse(jsonString)দ্বিতীয়বার কল করতে হয় না ।

এটি আমার প্রয়োজনের জন্য ভালভাবে কাজ করছে বলে মনে হচ্ছে:

function tryParseJSON (jsonString){
    try {
        var o = JSON.parse(jsonString);

        // Handle non-exception-throwing cases:
        // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
        // but... JSON.parse(null) returns null, and typeof null === "object", 
        // so we must check for that, too. Thankfully, null is falsey, so this suffices:
        if (o && typeof o === "object") {
            return o;
        }
    }
    catch (e) { }

    return false;
};

9
পৃষ্ঠার উত্তরগুলির মধ্যে, এটি সবচেয়ে শক্তিশালী এবং নির্ভরযোগ্য।
জোনলাইন

28
o && o !== nullঅতিশয় হয়।
আলেক্সেই মাতিউশকিন

4
তাই টাইপফের সাথে ট্রিপল-সমান ব্যবহার করা হচ্ছে, যা সর্বদা একটি স্ট্রিং দেয়। :)
হেইন হ্যারাল্ডসন বার্গ

5
একটি পুরানো পোস্টে হওয়া সত্ত্বেও আমি ভেবেছিলাম এটা উপযুক্ত একটি লাগাতে বেহালার আপনার উত্তর @matth প্রদর্শক আপ, দয়া করে মনে রাখবেন যে বস্তু বৈধ হবে না .. আপনি যদি একটি JSON স্ট্রিংকে পাস করতে হবে। আমার ধারণা অনুমান করা যে কারও পক্ষে কার্যকর হতে পারে।
মাইন্ডভক্স

2
ফাংশন ফেরত পাঠাবেন undefinedনা falseকারণ falseএকটি বৈধ JSON স্ট্রিং এবং সেখানে মধ্যে পার্থক্য করতে কোন উপায় নেই tryParseJSON("false")এবংtryParseJSON("garbage")
sparebytes

54
// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

ব্যবহার: isJSON({}) হবে false, isJSON('{}')হবে true

কিছু একটি Arrayবা Object( পার্সড জেএসএন) আছে কিনা তা পরীক্ষা করতে :

// vanillaJS
function isAO(val) {
    return val instanceof Array || val instanceof Object ? true : false;
}

// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;

ব্যবহার: isAO({}) হবে true, isAO('{}')হবে false


4
nullএই বৈধতাটি পাস করার পরে সাবধান হন ।
ফরজাদ ওয়াইজেড

2
return !!(JSON.parse(str) && str);নাল মান অবরুদ্ধ করা উচিত। আমি এই কোড সহ উত্তর আপডেট করব।
মাচাদো

1
এটি সেরা উত্তর, যেহেতু এটি আপনাকে জেএসওএন আপত্তিজনক হয়েছে কিনা তা পরীক্ষা করে দেখার অনুমতি দেয় এবং এভাবে parse()পরীক্ষাটি পাস না করে ডাব্লুটিএফ-এর কারণ হয়।
not2qubit

29

এখানে আমার কাজের কোড:

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

1
(নাল) IsJsonString; // সত্য প্রত্যাবর্তন। এটি তুলনা করে স্থির করা যেতে পারেtypeof str === 'string'
1919

22

আমি একটি সত্যিকারের সরল পদ্ধতি ব্যবহার করেছিলাম এটি একটি কার্যকর JSON কী না তা স্ট্রিংটি যাচাই করতে।

function testJSON(text){
    if (typeof text!=="string"){
        return false;
    }
    try{
        JSON.parse(text);
        return true;
    }
    catch (error){
        return false;
    }
}

একটি বৈধ JSON স্ট্রিং সহ ফলাফল:

var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;

একটি সাধারণ স্ট্রিং সহ ফলাফল;

var input='This is not a JSON string.';
testJSON(input); // returns false;

একটি বস্তুর সাথে ফলাফল:

var input={};
testJSON(input); // returns false;

নাল ইনপুট সহ ফলাফল:

var input=null;
testJSON(input); // returns false;

শেষটি মিথ্যা প্রত্যাবর্তন করে কারণ নাল ভেরিয়েবলের ধরণটি বস্তু।

এটি প্রতিটি সময় কাজ করে। :)


1
JSON.parse (নাল), JSON.parse ("মিথ্যা") ত্রুটি ছুঁড়ে না, সম্ভবত আরও উদাহরণ রয়েছে
klodoma

হ্যাঁ, আপনি ঠিক বলেছেন, ইনপুটটি কীভাবে স্ট্রিং কিনা তা আমি ভুলে গিয়েছিলাম, যদি আমি nullএটি করি তবে ইনপুট সহ এই পদ্ধতিটি মিথ্যা ফিরিয়ে দেয়। তবে "মিথ্যা" ইনপুটটি একটি বৈধ JSON স্ট্রিং। এটি পার্স করা হবে boolean (false)। এখন আমি কোডটি আরও সঠিক হতে সংশোধন করছি।
কুক্কো

15

PrototypeJS, আমরা পদ্ধতি আছে isJSON । আপনি এটি চেষ্টা করতে পারেন। এমনকি json সাহায্য করতে পারে।

"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();

9
ধন্যবাদ, তবে আমি মনে করি এটি করার জন্য প্রোটোটাইপ লাইব্রেরিটি ব্যবহার করা কিছুটা অতিরিক্ত দক্ষতাযুক্ত।
চি চান

4
আপনি চারটি উদাহরণ দিয়েছিলেন তবে কেবল তিনটি ফলাফল। ফলাফল কী "{ foo: 42 }".isJSON()? যদি false, আমি ধরে নিই (ফলাফলটি এটি নথির ফাংশনটি অনুসরণ করে) তবে ভাল প্রশ্নটি কেন এটি মিথ্যা? { foo: 42 }পুরোপুরি বৈধ JSON বলে মনে হচ্ছে।
ট্র্যাজার

4
@ ট্রেজেদার দুর্ভাগ্যক্রমে, জেএসএন স্পেকের জন্য উদ্ধৃত কীগুলি দরকার।
মিকর্ম্কনিল

4
এবং "2002-12-15" .আইজেএসএন সত্য প্রত্যাবর্তন করে, যখন জেএসএন.পারস ("2002-12-15") একটি ত্রুটি ছুঁড়ে দেয়।
ychaouche

4
আমি মনে করি যে এখানে আরও ভাল উত্তর হ'ল সেই ফাংশনটি প্রোটোটাইপ লাইব্রেরি থেকে বের করে এখানে এনে দেওয়া। বিশেষ করে যেহেতু api.prototypejs.org/language/string/prototype/isjson 404. হয়
jcollum

5

প্রোটোটাইপ ফ্রেমওয়ার্ক String.isJSONসংজ্ঞা থেকে এখানে

/**
   *  String#isJSON() -> Boolean
   *
   *  Check if the string is valid JSON by the use of regular expressions.
   *  This security method is called internally.
   *
   *  ##### Examples
   *
   *      "something".isJSON();
   *      // -> false
   *      "\"something\"".isJSON();
   *      // -> true
   *      "{ foo: 42 }".isJSON();
   *      // -> false
   *      "{ \"foo\": 42 }".isJSON();
   *      // -> true
  **/
  function isJSON() {
    var str = this;
    if (str.blank()) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

সুতরাং এটি এমন একটি সংস্করণ যা কোনও স্ট্রিং অবজেক্টকে পাস করে ব্যবহার করা যেতে পারে

function isJSON(str) {
    if ( /^\s*$/.test(str) ) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

function isJSON(str) {
    if ( /^\s*$/.test(str) ) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

console.log ("this is a json",  isJSON( "{ \"key\" : 1, \"key2@e\" : \"val\"}" ) )

console.log("this is not a json", isJSON( "{ \"key\" : 1, \"key2@e\" : pippo }" ) )


1
এই সমস্ত উত্তর তুলনা করার জন্য টেস্ট স্যুট আছে কারও? আমি এটি সঠিক কিনা তা দেখতে চাই।
লনি সেরা

1
@ লনিবেস্ট ভাল পয়েন্ট আমার 2 সেন্ট। আমি উত্পাদন বছর ধরে ব্যবহার করেছি এবং এটি সর্বদা সূক্ষ্ম এবং একটি যুক্তিসঙ্গত মৃত্যুর সময় সহ কার্যকর হয়েছে।
loretoparisi

4

ট্রাইচ্যাচ স্টেটমেন্টের ব্যয় কমাতে এই উত্তর।

আমি জে.এস.আর.কে JSON স্ট্রিং পার্স করার জন্য ব্যবহার করেছি এবং আমি ব্যতিক্রমগুলি পরিচালনা করতে ট্র্যাচ্যাচ স্টেটমেন্ট ব্যবহার করেছি, তবে আন-পার্সেবল স্ট্রিংয়ের জন্য ব্যতিক্রম ছোঁড়াটি আমার কোডকে ধীর করে দিয়েছে, তাই আমি স্ট্রিংটি পরীক্ষা করতে সরল রেইজেক্স ব্যবহার করেছি এটি যদি সম্ভব জেএসএন স্ট্রিং না থাকে বা পালক না করেই না হয় এটি সিনট্যাক্স পরীক্ষা করে, তারপরে আমি JQuery ব্যবহার করে স্ট্রিংটিকে বিশ্লেষণ করে নিয়মিতভাবে ব্যবহার করেছি:

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

নেস্টেড জেএসওএন প্রতিক্রিয়াগুলি পার্স করার জন্য আমি পূর্ববর্তী কোডটি একটি পুনরাবৃত্ত ফাংশনে আবৃত করেছিলাম।


JSON.parse () না করে jQuery কী করে?
এডি জেঙ্কস

3

হতে পারে এটি কার্যকর হবে:

    function parseJson(code)
{
    try {
        return JSON.parse(code);
    } catch (e) {
        return code;
    }
}
function parseJsonJQ(code)
{
    try {
        return $.parseJSON(code);
    } catch (e) {
        return code;
    }
}

var str =  "{\"a\":1,\"b\":2,\"c\":3,\"d\":4,\"e\":5}";
alert(typeof parseJson(str));
alert(typeof parseJsonJQ(str));
var str_b  = "c";
alert(typeof parseJson(str_b));
alert(typeof parseJsonJQ(str_b));

আউটপুট:

আই 7: স্ট্রিং , অবজেক্ট, স্ট্রিং, স্ট্রিং

ক্রোম: অবজেক্ট, অবজেক্ট, স্ট্রিং, স্ট্রিং


2

আমি মনে করি আমি জানি আপনি কেন তা এড়াতে চান। তবে সম্ভবত চেষ্টা করুন & ধরা! == চেষ্টা করুন এবং ধরুন। ; ও) আমার মনে এলো:

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

সুতরাং আপনি JSON অবজেক্টে নোংরা ক্লিপও পেতে পারেন, যেমন:

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

এটি যতটা সম্ভব এনক্যাপসুলিউড হিসাবে এটি ত্রুটিতে ভেঙে যেতে পারে না।


2

এখানেও টাইপস্ক্রিপ্ট সংস্করণ রয়েছে:

JSONTryParse(input) {
    try {
        //check if the string exists
        if (input) {
            var o = JSON.parse(input);

            //validate the result too
            if (o && o.constructor === Object) {
                return o;
            }
        }
    }
    catch (e) {
    }

    return false;
};

টাইপস্ক্রিপ্ট জাভাস্ক্রিপ্ট নয়, তবে আপনার উত্তর বলে মনে হচ্ছে।
লনি সেরা


1

আমি প্রারম্ভিক মন্তব্যটি থেকে অনুমান করি যে ব্যবহারের কেসটি প্রতিক্রিয়া এইচটিএমএল বা জেএসএন কিনা তা বর্ণিত করছে। কোন ক্ষেত্রে, আপনি যখন জেএসওএন গ্রহণ করবেন তখন আপনার সম্ভবত এটি অবশ্যই বিশ্লেষণ করা এবং আপনার কোডের কোনও কোনও সময়ে অবৈধ জেএসএনকে পরিচালনা করা উচিত। যেকোনও বিষয় বাদে, আমি কল্পনা করি আপনি JSON এর প্রত্যাশা করা উচিত তবে আপনার ব্রাউজারের মাধ্যমে অবহিত হতে চান তবে অবৈধ JSON পেয়েছে (যেমন ব্যবহারকারীরা কিছু অর্থপূর্ণ ত্রুটির বার্তার প্রক্সি দিয়ে যাবে)!

JSON- এর জন্য একটি সম্পূর্ণ রেগেক্স করা অতএব অপ্রয়োজনীয় (এটি যেমন - আমার অভিজ্ঞতায় - বেশিরভাগ ব্যবহারের ক্ষেত্রে)। আপনি সম্ভবত নীচের মত কিছু ব্যবহার করে ভাল হবে:

function (someString) {
  // test string is opened with curly brace or machine bracket
  if (someString.trim().search(/^(\[|\{){1}/) > -1) {
    try { // it is, so now let's see if its valid JSON
      var myJson = JSON.parse(someString);
      // yep, we're working with valid JSON
    } catch (e) {
      // nope, we got what we thought was JSON, it isn't; let's handle it.
    }
  } else {
    // nope, we're working with non-json, no need to parse it fully
  }
}

আপনি ব্যতিক্রম হ্যান্ডেল বৈধ অ তাদেরকে JSON কোডে থাকার সংরক্ষণ করা উচিত এবং একই সময়ে ডাফের JSON যত্ন নিতে।


এই হাইব্রিড সমাধানটি মনে হয় বেশিরভাগ জেএসওএন-এর ক্ষেত্রে চেষ্টা চালিয়ে যাওয়া এড়াতে এটি একটি কার্যকর উপায়। আপনার পদ্ধতির সেই দিকটি আমি পছন্দ করি।
লনি সেরা

1
if(resp) {
    try {
        resp = $.parseJSON(resp);
        console.log(resp);
    } catch(e) {
        alert(e);
    }
}

আশা করি এটি আপনার জন্যও কাজ করে


0
function get_json(txt)
{  var data

   try     {  data = eval('('+txt+')'); }
   catch(e){  data = false;             }

   return data;
}

যদি ত্রুটি থাকে তবে মিথ্যা প্রত্যাবর্তন করুন।

যদি কোনও ত্রুটি না থাকে তবে জসন ডেটা ফিরুন


4
প্রশ্নে: "সমাধানটিতে চেষ্টা / ধরা থাকা উচিত নয়"।
ddmps

1
কেন? এটি গ্যারান্টিযুক্ত উপায় ... অপব্যবহার বোকামি হবে! আমি ইংরেজি না জানার জন্য দুঃখিত আমি গুগল অনুবাদ ব্যবহার করেছি
এমরাহ টুনসেল

মজাদার. আমি এই বিভক্ত ভিত্তিক সমাধানের তুলনায় JSON.parse এর পারফরম্যান্স তুলনা দেখতে চাই। তবুও সুরক্ষা / ইনজেকশন দৃষ্টিকোণ থেকে এই চেহারা ভীতিজনক।
লনি সেরা

0

আপনি জাভাস্ক্রিপ্ট eval () ফাংশনটি বৈধ কিনা তা যাচাই করতে ব্যবহার করতে পারেন ।

যেমন

var jsonString = '{ "Id": 1, "Name": "Coke" }';
var json;

try {
  json = eval(jsonString);
} catch (exception) {
  //It's advisable to always catch an exception since eval() is a javascript executor...
  json = null;
}

if (json) {
  //this is json
}

বিকল্পভাবে, আপনি json.orgJSON.parse থেকে ফাংশনটি ব্যবহার করতে পারেন :

try {
  json = JSON.parse(jsonString);
} catch (exception) {
  json = null;
}

if (json) {
  //this is json
}

আশাকরি এটা সাহায্য করবে.

সতর্কতা : যদি কেউ দূষিত জেএস কোড যুক্ত করে তবে eval()এটি বিপজ্জনক , যেহেতু এটি কার্যকর করে দেবে। নিশ্চিত করুন যে জেএসএন স্ট্রিং বিশ্বাসযোগ্য , অর্থাৎ আপনি এটি কোনও বিশ্বস্ত উত্স থেকে পেয়েছেন।

আমার 1 ম সমাধানের জন্য সম্পাদনা করুন , এটি করার পরামর্শ দেওয়া হচ্ছে।

 try {
      json = eval("{" + jsonString + "}");
    } catch (exception) {
      //It's advisable to always catch an exception since eval() is a javascript executor...
      json = null;
    }

করার গ্যারান্টি JSON-অন্তরীপ। যদি jsonStringখাঁটি JSON না হয় তবে এভাল একটি ব্যতিক্রম ছুঁড়ে দেবে।


ইভাল ব্যবহার করে প্রথম উদাহরণে বলা হয়েছে যে "<ডিভি> ফু </ ডিভি>" বৈধ JSON। এটি বিভিন্ন ব্রাউজারগুলিতে আলাদাভাবে কাজ করতে পারে তবে এটি ফায়ারফক্সে প্রদর্শিত হয়, ইভাল () এক্সএমএল গ্রহণ করে।
মার্ক লুটন

আপনাকে ধন্যবাদ, তবে আমি এই দলের সাথেই এটি চালিয়েছি এবং তারা এমন কিছু চায় যা চেষ্টা / ধরা ব্যবহার করে না। প্রশ্নটি একটি নতুন শিরোনাম সহ সম্পাদনা করা হয়। এর জন্যে দুঃখিত.
চি চান

@ মার্ক লটন, অবজেক্টের ধরণটি জেএসএনের নয় তবে এক্সএমএল ডম ডকুমেন্টের (ফায়ারফক্সের সঠিক টাইপটি কী তা আমি ভুলে গিয়েছি)।
বুহাকে সিন্ধি

1
eval বৈধ জাভাস্ক্রিপ্ট গ্রহণ করে, যেমন "সতর্কতা (5)" এবং একক উদ্ধৃতিতে স্ট্রিং, যা বৈধ JSON নয়।
মার্ক লুটন

12
এটি খাঁটি al
ক্রিস বেকার

0

ওহ, আপনি অবশ্যই এটি কার্যকর বৈধ জেএসওএন কিনা তা যাচাই করার জন্য ক্যাচ ব্যবহার করতে পারেন

ফিরফক্স কোয়ান্টাম 60.0.1 এ পরীক্ষিত

JSON পরীক্ষা করতে কোনও ফাংশনের অভ্যন্তরে ফাংশন ব্যবহার করুন এবং স্ট্রিংটিকে বৈধতা দেওয়ার জন্য সেই আউটপুটটি ব্যবহার করুন। একটি উদাহরণ শুনে।

    function myfunction(text){

       //function for validating json string
        function testJSON(text){
            try{
                if (typeof text!=="string"){
                    return false;
                }else{
                    JSON.parse(text);
                    return true;                            
                }
            }
            catch (error){
                return false;
            }
        }

  //content of your real function   
        if(testJSON(text)){
            console.log("json");
        }else{
            console.log("not json");
        }
    }

//use it as a normal function
        myfunction('{"name":"kasun","age":10}')

0

যে ফাংশনটি IsJsonString(str)ব্যবহার করা JSON.parse(str)হচ্ছে তা আমার ক্ষেত্রে কাজ করে না।
আমি গ্রাফিকিউসিএল থেকে জসন আউটপুট যাচাই করার চেষ্টা করেছি এটি সর্বদা মিথ্যা বলে প্রত্যাবর্তন করে। ভাগ্যবান আমার, আইএসএসন আরও ভাল কাজ করে:

var test = false;

$('body').on('DOMSubtreeModified', '.resultWrap', function() {

    if (!test) {   
        var resultWrap = "{" + $('#graphiql .resultWrap').text().split("{").pop();
        if isJSON(resultWrap) {test = !test;}
        console.log(resultWrap); 
        console.log(resultWrap.isJSON());
    }

});

নমুনা আউটপুট:

THREE.WebGLRenderer 79
draw.js:170 {xxxxxxxxxx
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}
draw.js:170 true

0

এমন লোকদের জন্য যারা "ট্রাই" ফাংশনগুলির নেট নেট কনভেনশন পছন্দ করে যা কোনও বুলিয়ান ফিরে আসে এবং ফলাফল সমেত একটি বাইরেফ পরম পরিচালনা করে। আপনার যদি আউট প্যারামিটারের প্রয়োজন না হয় তবে আপনি এটি বাদ দিতে পারেন এবং কেবলমাত্র ফেরতের মানটি ব্যবহার করতে পারেন।

StringTests.js

  var obj1 = {};
  var bool1 = '{"h":"happy"}'.tryParse(obj1); // false
  var obj2 = {};
  var bool2 = '2114509 GOODLUCKBUDDY 315852'.tryParse(obj2);  // false

  var obj3 = {};
  if('{"house_number":"1","road":"Mauchly","city":"Irvine","county":"Orange County","state":"California","postcode":"92618","country":"United States of America","country_code":"us"}'.tryParse(obj3))
    console.log(obj3);

StringUtils.js

String.prototype.tryParse = function(jsonObject) {
  jsonObject = jsonObject || {};
  try {
    if(!/^[\[{]/.test(this) || !/[}\]]$/.test(this)) // begin / end with [] or {}
      return false; // avoid error handling for strings that obviously aren't json
    var json = JSON.parse(this);
    if(typeof json === 'object'){
      jsonObject.merge(json);
      return true;
    }
  } catch (e) {
    return false;
  }
}

ObjectUtils.js

Object.defineProperty(Object.prototype, 'merge', {
  value: function(mergeObj){
    for (var propertyName in mergeObj) {
      if (mergeObj.hasOwnProperty(propertyName)) {
        this[propertyName] = mergeObj[propertyName];
      }      
    }
    return this;
  },
  enumerable: false, // this is actually the default
});

-1

খুব সাধারণ ওয়ানলাইনার কোড (তবে হ্যাকি পদ্ধতির)

if (expected_json.id === undefined){
   // not a json
}
else{
   // json
}

দ্রষ্টব্য: এটি কেবল তখনই কাজ করে যদি আপনি কিছু প্রত্যাশা করছেন আইডির মতো জেএসএন স্ট্রিং। আমি এটিকে একটি এপিআই এর জন্য ব্যবহার করছি এবং ফলাফলটি জেএসএন বা কিছু ত্রুটিযুক্ত স্ট্রিংয়ে প্রত্যাশা করছি।

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