একটি স্ট্রিং জেএসওএন কিনা তা কীভাবে পরীক্ষা করবেন?


191

আমার কাছে একটি সাধারণ এজেএক্স কল রয়েছে এবং সার্ভারটি কার্যকরভাবে ডেটা বা পিএইচপি ফাংশন দ্বারা উত্পাদিত ত্রুটি বার্তা স্ট্রিং সহ একটি JSON স্ট্রিং ফিরিয়ে দেবে mysql_error()। এই ডেটাটি JSON স্ট্রিং বা ত্রুটি বার্তা কিনা তা আমি কীভাবে পরীক্ষা করতে পারি।

কোনও ফাংশন যেমন isJSONঠিক instanceofতেমন ব্যবহার করা যায় তা পরীক্ষা করার জন্য আপনি কোনও ফাংশন ব্যবহার করতে পারেন ঠিক তেমন ফাংশন ব্যবহার করা ভাল ।

এটাই আমি চাই:

if (isJSON(data)){
    //do some data stuff
}else{
    //report the error
    alert(data);
}

সম্ভবত eval()যদি এটির undefinedপরে ফিরে আসে তবে এটি
জেএসএন

4
এটি এখানে সমাধান করা হয়েছে: স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

2
সবাইকে ধন্যবাদ, দুঃখিত আমি এর আগে অন্য পোস্টটি পাইনি।
jeffery_t__ind

1
প্রযুক্তিগতভাবে এটি 3710204 এর কোনও ডুপ নয়, কারণ এটি জিজ্ঞাসা করে যে এটি বৈধ জাসন যা কোনও পাস করার চেয়ে অনেক বেশি বার যা এটি জসন নয়।
carlin.scott

উত্তর:


321

JSON.parse ব্যবহার করুন

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

53
ব্যতিক্রম হ্যান্ডলিং প্রত্যাশিত কিছু করতে ব্যবহার করা উচিত নয়।
লুইজভালেটা

44
JSON.parse(1234)বা JSON.parse(0)OR JSON.parse(false)বা JSON.parse(null)সমস্ত ব্যতিক্রম উত্থাপন করবে না এবং সত্য ফিরে আসবে !! এই উত্তরটি ব্যবহার করবেন না
জালাবোজা

19
@Zalaboza 1234, 0, false, এবং nullসব বৈধ JSON মান। আপনি যদি এমন কোনও শিকারী চান যা পরীক্ষা করে যদি জেএসওএন কোনও বস্তুর প্রতিনিধিত্ব করে তবে আপনাকে আরও কিছু করা দরকার।
মাইকেল ল্যাং

20
JSON.parseস্ট্রিংটিকে বিশ্লেষণ করার জন্য প্রচুর গণনা করে এবং জেসন অবজেক্টটি এটি সফল হলে আপনাকে দেয়, তবুও আপনি যে ফলাফলটি ব্যবহার করতে পারেন তা কিছুটা ছাড়ছেন। এটি ভাল বলে মনে হয় না। আমি পরিবর্তে return {value: JSON.parse(str), valid: true};এবং ক্যাচ ব্লকে return {value: str, valid: false};ছিলাম .. এবং আমি ফাংশনটির নামটি পরিবর্তন করব tryParse()
নওয়াজ

7
@ লুইজ্যাভালেটা তারপরে আপনি কী পদ্ধতি হিসাবে পরামর্শ দিচ্ছেন
পাইরেটঅ্যাপ

80

এই কোড হল JSON.parse(1234)বা JSON.parse(0)বাJSON.parse(false) বা JSON.parse(null)সব সত্য ফিরে আসবে।

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

সুতরাং আমি এইভাবে কোডটি আবার লিখেছি:

function isJson(item) {
    item = typeof item !== "string"
        ? JSON.stringify(item)
        : item;

    try {
        item = JSON.parse(item);
    } catch (e) {
        return false;
    }

    if (typeof item === "object" && item !== null) {
        return true;
    }

    return false;
}

পরীক্ষার ফলাফল:

isJson পরীক্ষার ফলাফল


4
চমৎকার কাজ! আপনার শেষটি যদি বিবৃতিটিকে সাধারণ রিটার্নের বিবৃতিতে সরলীকৃত করা যেতে পারে যেমন:return (typeof suspect === "object" && suspect !== null);
নেবুলোসার

38

আসুন এটি পুনরুদ্ধার (2019+ এর জন্য)।

আর্গুমেন্ট : মানগুলি যেমন true, false, nullবৈধ করছেন তাদেরকে JSON (?)

সত্য : এই আদিম মানগুলি JSON- পার্সেবল, তবে এগুলি JSON কাঠামোটি সু-গঠিত হয় না । JSON স্পেসিফিকেশন ইঙ্গিত দেয় যে জেএসওএন দুটি কাঠামোর উপর নির্মিত: নাম / মান জুড়ি (বস্তু) বা মানগুলির একটি আদেশযুক্ত তালিকা (অ্যারে) collection

যুক্তি : ব্যতিক্রম হ্যান্ডলিং প্রত্যাশিত কিছু করতে ব্যবহার করা উচিত নয়।
(এটি এমন একটি মন্তব্য যা 25+ আপভোট রয়েছে!)

সত্য : না! চেষ্টা / ধরা বিশেষত এরকম ক্ষেত্রে ব্যবহার করা আইনত অবশ্যই। অন্যথায়, আপনাকে টোকেনাইজিং / রেজেক্স অপারেশনগুলির মতো স্ট্রিং অ্যানালাইসিস স্টাফগুলি করতে হবে; যা ভয়ানক অভিনয় করবে।

hasJsonStructure()

আপনার লক্ষ্যটি যদি কোনও ডেটা / পাঠ্যের যথাযথ জেএসওএন ইন্টারচেঞ্জ ফর্ম্যাট আছে কিনা তা পরীক্ষা করা যদি এটি কার্যকর হয়।

function hasJsonStructure(str) {
    if (typeof str !== 'string') return false;
    try {
        const result = JSON.parse(str);
        const type = Object.prototype.toString.call(result);
        return type === '[object Object]' 
            || type === '[object Array]';
    } catch (err) {
        return false;
    }
}

ব্যবহার:

hasJsonStructure('true')             // —» false
hasJsonStructure('{"x":true}')       // —» true
hasJsonStructure('[1, false, null]') // —» true

safeJsonParse()

এবং আপনি যদি জাভাস্ক্রিপ্ট মানটিতে কিছু ডেটা পার্স করার সময় সাবধানতা অবলম্বন করতে চান তবে এটি কার্যকর।

function safeJsonParse(str) {
    try {
        return [null, JSON.parse(str)];
    } catch (err) {
        return [err];
    }
}

ব্যবহার:

const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
    console.log('Failed to parse JSON: ' + err.message);
} else {
    console.log(result);
}

1
আপনি জেএসওএন স্পেকের সাথে লিঙ্ক করেছেন নিম্নলিখিতটি বলেছেন: "একটি জেএসওএন পাঠ্যটি ইউনিকোড কোড পয়েন্ট থেকে তৈরি টোকেনগুলির একটি ক্রম যা জেএসওএন মান ব্যাকরণের সাথে সঙ্গতিপূর্ণ।" এবং "একটি জেএসওএন মান কোনও বস্তু, অ্যারে, সংখ্যা, স্ট্রিং, সত্য, মিথ্যা বা নাল হতে পারে।" - আপনি কীভাবে এই সিদ্ধান্তে পৌঁছলেন যে কোনও JSON কেবলমাত্র মূল স্তরে অবজেক্ট বা অ্যারে হতে পারে? আমি
অনুমানের

পড়ুন দ্বিতীয় অনুচ্ছেদ যে দিয়ে শুরু হয় "তাদেরকে JSON দুই কাঠামো নির্মিত হয় ..." @ json.org অথবা 4 র্থ ও 5 ম অনুচ্ছেদ ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
হল Onur ইলদিরিম

json.org কেবল তথ্যবহুল। আপনি যে লিঙ্কটি যুক্ত করেছেন তা পড়া আপনার পরামর্শটিকে সমর্থন করে না। অনুমানগুলি আরএফসি 8259 কে সর্বশেষতম আরএফসি হিসাবে উল্লেখ করেছে। বৈধ JSON শুধুমাত্র ধারণকারী texs উদাহরণ কটাক্ষপাত মান tools.ietf.org/html/rfc8259#section-13 - বোঝায় যা RFC 8259 সম্ভব অস্পষ্টতা এবং বিভ্রান্তি, শুধু এই মত সমাধান করতে ডিজাইন করা হয়েছে।
পুনরায় সাংস্কৃতিক

উত্তরটি আবার পড়ুন। আমি বলছি যেমন আদিম (যেমন আরএফসির উদাহরণগুলিতে পাঠ্য মান) JSON "কাঠামো" নয়। কোনও অস্পষ্টতা নেই। আপনি তাদের JSON হিসাবে পার্স করতে পারেন, এটি করা বৈধ। তবে এগুলি কাঠামোগত ডেটা নয়। জেএসএন মূলত একটি ইন্টারচেঞ্জ ফর্ম্যাট হিসাবে উদ্ভাবিত »যা কাঠামোগত ডেটার জন্য ব্যবহৃত হয় - যা কোনও বস্তু বা অ্যারে হতে পারে।
ওনুর ইল্ডারিয়াম

1
ঠিক আছে, তাই আমি মনে করি আমরা একমত হই। প্রাইমারিটিভগুলি স্পেসিফিকেশন অনুযায়ী বৈধ জেএসএন, তবে এটি "স্ট্রাকচার" নয়। সেটা ঠিক আছে. তবে, আপনি বলেছিলেন "যুক্তি: সত্য, মিথ্যা, নাল হিসাবে মানগুলি বৈধ JSON (?) Are সত্য: হ্যাঁ এবং না!" - ঘটনাটি স্পেসিফিকেশন অনুযায়ী বৈধ JSON ON তারা কার্যকর কিনা সে সম্পর্কে মতামতগুলি এই সত্যটির সাথে অপ্রাসঙ্গিক।
পুনঃপ্রকাশ

20

সার্ভারটি যদি JSON এর সাথে প্রতিক্রিয়া জানাচ্ছে তবে এতে একটি application/jsonবিষয়বস্তুর ধরণ থাকবে, যদি এটি একটি সরল পাঠ্য বার্তা দিয়ে প্রতিক্রিয়া জানায় তবে এতে একটি সামগ্রী-প্রকার থাকা উচিত text/plain। নিশ্চিত করুন যে সার্ভারটি সঠিক কন্টেন্ট-টাইপের সাথে প্রতিক্রিয়া দিচ্ছে এবং এটি পরীক্ষা করে।


4
এটি ভুল, আরও অনেক জসন-সামঞ্জস্যপূর্ণ মিডিয়াটাইপ রয়েছে। উপরন্তু overrideMimeTypeসামগ্রী-প্রকার হেডার ওভাররাইড করতে পারে।
নু

13

প্রতিক্রিয়াটি JSON হলে jQuery $.ajax()প্রতিক্রিয়াটি ব্যবহার করার সময় responseJSONসম্পত্তি থাকবে this

if (xhr.hasOwnProperty('responseJSON')) {}

2
এই আমি সন্দেহ সত্যিই উত্তর যে অধিকাংশ লোক খুঁজছেন, সম্ভবত এমনকি ওপি হয়
কারবি

এটি চেষ্টা ব্লক ব্যবহার করার চেয়ে অনেক বেশি মার্জিত
অনুরাগ সিনহা

6

আমি সেরা উত্তর পছন্দ করি তবে এটি যদি খালি স্ট্রিং হয় তবে এটি সত্য হয়। সুতরাং এখানে একটি ঠিক আছে:

function isJSON(MyTestStr){
    try {
        var MyJSON = JSON.stringify(MyTestStr);
        var json = JSON.parse(MyJSON);
        if(typeof(MyTestStr) == 'string')
            if(MyTestStr.length == 0)
                return false;
    }
    catch(e){
        return false;
    }
    return true;
}

var json ব্যবহার হয় না? বা শুধু ত্রুটি ধরা?
স্ট্যাকডেভ

5
var parsedData;

try {
    parsedData = JSON.parse(data)
} catch (e) {
    // is not a valid JSON string
}

যাইহোক, আমি আপনাকে পরামর্শ দেব যে আপনার এইচটিপি কল / পরিষেবাটি সর্বদা একই ফর্ম্যাটে কোনও ডেটা ফেরা উচিত। সুতরাং আপনার যদি কোনও ত্রুটি থাকে তবে তার চেয়ে আপনার কোনও JSON অবজেক্ট থাকা উচিত যা এই ত্রুটিটি মুড়িয়ে দেয়:

{"error" : { "code" : 123, "message" : "Foo not supported" } } 

এবং সম্ভবত এইচটিটিপি স্ট্যাটাসের সাথে একটি 5XX কোড ব্যবহার করুন।


5

আচ্ছা ... আপনি যেভাবে আপনার ডেটা গ্রহণ করছেন তা নির্ভর করে। আমি মনে করি সার্ভারটি একটি JSON ফর্ম্যাট স্ট্রিং (পিএইচপি-তে json_encode () ব্যবহার করে) দিয়ে সাড়া দিচ্ছে। যদি আপনি জিকিউরি পোস্ট ব্যবহার করেন এবং প্রতিক্রিয়া ডেটাটিকে জেএসএন ফর্ম্যাট হিসাবে সেট করেন এবং এটি একটি ত্রুটিযুক্ত জেএসওএন হয়, এটি একটি ত্রুটি তৈরি করবে:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        //Supposing x is a JSON property...
        alert(response.x);

  },
  dataType: 'json',
  //Invalid JSON
  error: function (){ alert("error!"); }
});

তবে, আপনি যদি পাঠ্য হিসাবে প্রতিক্রিয়া টাইপ ব্যবহার করেন তবে আপনার $ .parseJSON ব্যবহার করা দরকার। জেকারি সাইট অনুসারে: "একটি ত্রুটিযুক্ত জেএসএন স্ট্রিংয়ে পাস করার ফলে ব্যতিক্রম ছোঁড়া হতে পারে"। সুতরাং আপনার কোড হবে:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        try {
            parsedData = JSON.parse(response);
        } catch (e) {
            // is not a valid JSON string
        }

  },
  dataType: 'text',
});

যদি না, অবশ্যই আপনি উপরের উদাহরণে ত্রুটি ফাংশন ত্রুটি টেক্সট এবং নিশ্চিত এটি JSON নয় যদি ... পার্স করার চেষ্টা করছেন
কারবি

দুর্দান্ত উত্তর, যদিও responseএটি খালি থাকলে, এটিতে যাবে success: '(
হেনরিক পেটারসন

4

সম্ভবত আপনি পরীক্ষা করতে পারেন, উদাহরণস্বরূপ যদি আপনি জানেন যে JSON ফিরে এসেছে সর্বদা ঘিরে থাকবে {এবং }তারপরে আপনি এই চরিত্রগুলির জন্য পরীক্ষা করতে পারেন, বা অন্য কোনও হ্যাকি পদ্ধতি। অথবা আপনি json.org ব্যবহার করতে পারেন পার্স করতে এবং এটি সফল হয় কিনা তা পরীক্ষা করতে জেএস লাইব্রেরিটি ।

আমি তবে একটি ভিন্ন পদ্ধতির পরামর্শ দেব। আপনার পিএইচপি স্ক্রিপ্টটি বর্তমানে কলটি সফল হলে জেএসনকে ফেরত দেয় তবে তা না হলে অন্য কিছু। কেন সবসময় না জেএসএন ফেরত আসবে ?

যেমন

সফল কল:

{ "status": "success", "data": [ <your data here> ] }

ভ্রান্ত কল:

{ "status": "error", "error": "Database not found" }

এটি আপনার ক্লায়েন্টের পক্ষে জেএস লেখা আরও সহজ করে তুলবে - আপনাকে যা করতে হবে তা হল "স্ট্যাটাস" সদস্য এবং তদনুযায়ী আইনটি পরীক্ষা করা।


4

আমি এটি সম্পাদন করতে মাত্র 2 টি লাইন ব্যবহার করেছি:

var isValidJSON = true;
try { JSON.parse(jsonString) } catch { isValidJSON = false }

এখানেই শেষ!

তবে মনে রাখবেন 2 টি ফাঁদ রয়েছে:
1. JSON.parse(null)রিটার্ন null
2. কোনও সংখ্যা বা স্ট্রিংটি JSON.parse()পদ্ধতিতে পার্স করা যায় ।
   JSON.parse("5")রিটার্ন 5
   JSON.parse(5)দেয়5

আসুন কিছু কোডে খেলুন:

// TEST 1
var data = '{ "a": 1 }'

// Avoiding 'null' trap! Null is confirmed as JSON.
var isValidJSON = data ? true : false
try { JSON.parse(data) } catch(e) { isValidJSON = false }

console.log("data isValidJSON: ", isValidJSON);
console.log("data isJSONArray: ", isValidJSON && JSON.parse(data).length ? true : false);

Console outputs:
data isValidJSON:  true
data isJSONArray:  false


// TEST 2
var data2 = '[{ "b": 2 }]'

var isValidJSON = data ? true : false
try { JSON.parse(data2) } catch(e) { isValidJSON = false }

console.log("data2 isValidJSON: ", isValidJSON);
console.log("data2 isJSONArray: ", isValidJSON && JSON.parse(data2).length ? true : false);

Console outputs:
data2 isValidJSON:  true
data2 isJSONArray:  true


// TEST 3
var data3 = '[{ 2 }]'

var isValidJSON = data ? true : false
try { JSON.parse(data3) } catch(e) { isValidJSON = false }

console.log("data3 isValidJSON: ", isValidJSON);
console.log("data3 isJSONArray: ", isValidJSON && JSON.parse(data3).length ? true : false);

Console outputs:
data3 isValidJSON:  false
data3 isJSONArray:  false


// TEST 4
var data4 = '2'

var isValidJSON = data ? true : false
try { JSON.parse(data4) } catch(e) { isValidJSON = false }

console.log("data4 isValidJSON: ", isValidJSON);
console.log("data4 isJSONArray: ", isValidJSON && JSON.parse(data4).length ? true : false);


Console outputs:
data4 isValidJSON:  true
data4 isJSONArray:  false


// TEST 5
var data5 = ''

var isValidJSON = data ? true : false
try { JSON.parse(data5) } catch(e) { isValidJSON = false }

console.log("data5 isValidJSON: ", isValidJSON);
console.log("data5 isJSONArray: ", isValidJSON && JSON.parse(data5).length ? true : false);


Console outputs:
data5 isValidJSON:  false
data5 isJSONArray:  false

// TEST 6
var data6; // undefined

var isValidJSON = data ? true : false
try { JSON.parse(data6) } catch(e) { isValidJSON = false }

console.log("data6 isValidJSON: ", isValidJSON);
console.log("data6 isJSONArray: ", isValidJSON && JSON.parse(data6).length ? true : false);

Console outputs:
data6 isValidJSON:  false
data6 isJSONArray:  false

আমি jsfiddle.net/fatmonk/gpn4eyav এ এই উত্তরের জন্য একটি ফিডাল তৈরি করেছি যাতে আপনার নিজস্ব পরীক্ষার ডেটা যুক্ত করার বিকল্পও অন্তর্ভুক্ত রয়েছে। এটি আমার কাছে একটি ভাল লাইব্রেরি ফাংশনের ভিত্তির মতো মনে হয় তবে আমি কেন পরীক্ষা 1 বৈধ JSON অ্যারে নয় তা সম্পর্কে আরও জানতে চাই।
ফ্যাট সন্ন্যাস

কারণ একটি অ্যারে ব্যবহার করে [এবং নির্দিষ্ট করা আবশ্যক ]। উদাহরণস্বরূপ, [1, 2, 3]একটি সংখ্যা অ্যারে। ["a", "b", "c"]একটি স্ট্রিং অ্যারে। এবং [{"a":1}, {"b":2}]একটি JSON অ্যারে। আপনার jsfiddle কাজ সত্যিই দরকারী বলে মনে হচ্ছে!
এফকান

এর মত সহজ?! সুতরাং পরীক্ষা 1 হ'ল একটি JSON অবজেক্ট এবং টেস্ট 2 হ'ল একটি JSON অ্যারে যা একটি একক JSON অবজেক্ট উপাদান দ্বারা গঠিত object আমি কি এটি সঠিকভাবে বুঝতে পেরেছি?
ফ্যাট সন্ন্যাস

প্রশ্নটি এর সম্ভাব্য সদৃশ হিসাবে চিহ্নিত করা হয়েছে ( স্ট্যাকওভারফ্লো / প্রশ্ন / 1010১০২০৪/২ ) চেষ্টা / ধরা না ব্যবহার করে এটি অর্জন সম্পর্কে জিজ্ঞাসা করে তাই আমি সেই লক্ষ্যটি অর্জনের চেষ্টা করার জন্য আমার মিতাময়কেও কাঁটাচামচ করেছি। কাঁটাচামচটি jsfiddle.net/fatmonk/827jsuvrরয়েছে এবং টেস্ট 3 বাদে উপরের সমস্ত পরীক্ষার সাথে কাজ করে যা ত্রুটিযুক্ত JSON.parse। কেউ চেষ্টা না করে কীভাবে সেই ত্রুটিটি এড়ানো যায় সে বিষয়ে পরামর্শ দিতে পারেন?
ফ্যাট সন্ন্যাস

jsfiddleটেস্ট 3 এর কারণে আপনার অ্যাপ্লিকেশনটিতে একটি ত্রুটি ছুঁড়েছে যার কোনও বৈধ JSON এক্সপ্রেশন নেই। সুতরাং try-catchসেই ত্রুটিটি ধরতে এবং কোনও ত্রুটি মূল্যায়নের জন্য অবশ্যই উপরের টেস্ট 3 এর মত পার্সিংয়ের সময় JSON না হিসাবে অবশ্যই ব্যবহার করতে হবে:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
পার্সিংয়ের সময় জেএসএন

2

আপনি এটিকে ডিকোডিং এবং ব্যতিক্রম (দেশীয় বা json2.js ) ধরার চেষ্টা করতে পারেন :

try {
  newObj = JSON.parse(myJsonString);
} catch (e) {
  console.log('Not JSON');
}

যাইহোক, আমি প্রতিক্রিয়াটি সর্বদা বৈধ JSON হওয়ার পরামর্শ দেব। আপনি যদি আপনার মাইএসকিউএল কোয়েরি থেকে ফিরে ত্রুটি পান তবে কেবল ত্রুটি সহ জেএসএনকে প্রেরণ করুন:

{"error":"The MySQL error string."}

এবং তারপর:

if (myParsedJSON.error) {
  console.log('An error occurred: ' + myParsedJSON.error);
}

2

সতর্কতা: নির্ভরশীল পদ্ধতিগুলির জন্য JSON.parse- অ্যারে এবং কোটের চারপাশে থাকা স্ট্রিংগুলি খুব বেশি পাস হবে (অর্থাত্ console.log(JSON.parse('[3]'), JSON.parse('"\uD800"')))

সমস্ত অ-অবজেক্ট জেএসওন আদিমতা (বুলিয়ান, নাল, অ্যারে, সংখ্যা, স্ট্রিং) এড়ানোর জন্য, আমি নিম্নলিখিতটি ব্যবহার করার পরামর্শ দিই:

/* 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
    }
}

কোড ব্যাখ্যা

  • !! ও - মিথ্যা নয় (নাল বাদ দেয়, যা 'অবজেক্ট' হিসাবে নিবন্ধিত হয়)
  • (টাইফফ ও === 'অবজেক্ট') - বুলিয়ান, সংখ্যা এবং স্ট্রিং বাদ দেয়
  • ! অ্যারে.আইআরআরে (ও) - অ্যারেগুলি বাদ দিন (যা টাইপফোন 'অবজেক্ট' হিসাবে নিবন্ধিত)
  • চেষ্টা করুন ... JSON.stringify / JSON.parse - জাভাস্ক্রিপ্ট ইঞ্জিনটি বৈধ JSON কিনা তা নির্ধারণের জন্য জিজ্ঞাসা করে

জেসনস্ট্রাকচার () উত্তরটি কেন ব্যবহার করবেন না?

আস্থা রাখা toString() ভাল ধারণা নয়। এটি কারণ বিভিন্ন জাভাস্ক্রিপ্ট ইঞ্জিনগুলি একটি ভিন্ন স্ট্রিং উপস্থাপনা ফিরে আসতে পারে। সাধারণভাবে, যে পদ্ধতিগুলি এর উপর নির্ভর করে সেগুলি বিভিন্ন পরিবেশে ব্যর্থ হতে পারে বা পরে ব্যর্থ হতে পারে ইঞ্জিনের স্ট্রিং ফলাফলটি কখন পরিবর্তন করা উচিত

ব্যতিক্রম ধরা কেন হ্যাক নয়?

এটি উত্থাপিত হয়েছিল যে কোনও কিছুর বৈধতা নির্ধারণের জন্য ব্যতিক্রম ধরা কখনই সঠিক পথ হয় না। এটি সাধারণত ভাল পরামর্শ, তবে সবসময় না। এই ক্ষেত্রে, ব্যতিক্রম ধরা সম্ভবত সেরা রুট কারণ এটি জাভাস্ক্রিপ্ট ইঞ্জিনের JSON ডেটা বৈধকরণের প্রয়োগের উপর নির্ভর করে।

জেএস ইঞ্জিনের উপর নির্ভর করে নিম্নলিখিত সুবিধাগুলি সরবরাহ করে:

  1. জেএসএন স্পেস পরিবর্তন হওয়ার সাথে সাথে আরও নিখুঁত এবং ক্রমাগত আপ টু ডেট
  2. দ্রুত চালানোর সম্ভাবনা (এটি নিম্ন স্তরের কোড হিসাবে)

যখন জাভাস্ক্রিপ্ট ইঞ্জিনে ঝুঁকে পড়ার সুযোগ দেওয়া হবে, আমি এটি করার পরামর্শ দিই। বিশেষত তাই এই ক্ষেত্রে। যদিও এটি ব্যতিক্রমী হতে পারে বলে মনে হতে পারে তবে আপনি কেবলমাত্র একটি বাহ্যিক পদ্ধতি থেকে দুটি সম্ভাব্য রিটার্ন স্টেট পরিচালনা করছেন।


1

বোর্নের উত্তরে কিছুটা ছোটখাট পরিবর্তন সহ একটি কোড এখানে। যেহেতু JSON.parse (সংখ্যা) কোনও ব্যতিক্রম ছাড়াই সূক্ষ্ম কাজ করে তাই যোগ করা হয়েছেNNN।

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return isNaN(str);
}

0

সমস্ত জসন স্ট্রিংগুলি '{' বা '[' 'দিয়ে শুরু হয় এবং সংশ্লিষ্ট'} 'বা'] 'দিয়ে শেষ হয়, তবে কেবল এটির জন্য পরীক্ষা করুন।

এখানে Angular.js কী করে তা এখানে:

var JSON_START = /^\[|^\{(?!\{)/;
var JSON_ENDS = {
  '[': /]$/,
  '{': /}$/
};

function isJsonLike(str) {
    var jsonStart = str.match(JSON_START);
    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
}

https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js


@ ডুকডুগল কে পরিষ্কার করতে হবে? কখনও কখনও লোকেরা তাদের জেসনটি একটি '[' 'দিয়ে শুরু করেন তবে এটি মারাত্মক সাধারণ নয়।
carlin.scott

1
এটিকে কার্যকর করার জন্য আপনাকে এটিকে পার্স করা দরকার বৈধ জেএসওএন। যদি এটি অবৈধ JSON হয় তবে এটি JSON নয়। প্রশ্নটি হল "স্ট্রিং জেএসওএন কিনা তা কীভাবে বলবেন?"। আপনার পদ্ধতির দ্বারা, এটি JSON-fibble হবে - এবং এটি সত্যিই JSON নয়। নিজে থেকে 1 নম্বরর মতো মামলাগুলিও বিবেচনা করুন - এটি বৈধ জেএসওএন।
ডিউক ডগল

1
"যদি এটি অবৈধ JSON হয় তবে এটি JSON নয়"। আপনাকে "বৈধ" শব্দটি ব্যবহার করতে হবে তা দেখায় যে আপনি একটি যোগ্যতা যুক্ত করছেন যে এটি কেবল জসন ছাড়াও বেশি। প্রশ্নটি কেবল "এটি কি জসন" ছিল এবং আমার কোড উদাহরণটি অতিরিক্ত প্রয়োজনীয়তা না ধরেই সেই প্রশ্নের সঠিক উত্তর দেয়।
carlin.scott

খারাপ ধারণা আপনি যদি কিছু টেম্পলেট সিস্টেম ব্যবহার করেন এবং আপনার মতো কিছু থাকে যা { someValue }স্বয়ংক্রিয়ভাবে বৈধতাটি পাস করবে।
ncubica

@ncubica তাই আপনি জসন ব্যতীত অন্য কোনও কিছুর জন্য একটি টেম্পলেট ব্যবহার করছেন, স্ট্রিংটিতে কেবল স্থানধারক রয়েছে যা কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করে, এবং টেম্পলেট ইঞ্জিনটি স্থানধারকটিকে আসল মান দিয়ে প্রতিস্থাপন করতে ব্যর্থ হয়? এছাড়াও মনে রাখবেন, যেমন আমি ইতিমধ্যে ডিউকে বুঝিয়েছি, মূল প্রশ্নটিতে বৈধতার উল্লেখ নেই। তারা কেবল এটি জানতে চেয়েছিল যে এটি জসনের মতো দেখাচ্ছে কিনা।
carlin.scott


0

আমি এটি ব্যবহার করেছি (বিভিন্ন উত্তরের মিশ্রণের ধরণ, তবে যাইহোক):

const isJSON = str => {
  if (typeof str === 'string'){
    try {
      JSON.parse(str)
      return true
    } catch(e){
    }
  }
  return false
}



[null, undefined, false, true, [], {}, 
 '', 'asdf', '{}', '[]', "{\"abc\": 2}","{\"abc\": \"2\"}"]
  .map(el => {
      console.log(`[>${el}<] - ${isJSON(el)}`)
})

console.log('-----------------')


0

আপনি নিম্নলিখিতটি ব্যবহার করে দেখতে পারেন কারণ এটি সংখ্যা, নাল, স্ট্রিংকেও বৈধ করে তবে উপরের চিহ্নিত উত্তরটি সঠিকভাবে কাজ করছে না এটি উপরের ফাংশনটির ঠিক একটি স্থিরতা:

function isJson(str) {
  try {
      const obj = JSON.parse(str);
      if (obj && typeof obj === `object`) {
        return true;
      }
    } catch (err) {
      return false;
    }
   return false;
}

-1

পূর্ববর্তী উত্তরগুলি ছাড়াও, "{}" এর মতো আপনার কোনও জেএসওএন ফর্ম্যাটটি বৈধ করার প্রয়োজন হলে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

const validateJSON = (str) => {
  try {
    const json = JSON.parse(str);
    if (Object.prototype.toString.call(json).slice(8,-1) !== 'Object') {
      return false;
    }
  } catch (e) {
    return false;
  }
  return true;
}

ব্যবহারের উদাহরণ:

validateJSON('{}')
true
validateJSON('[]')
false
validateJSON('')
false
validateJSON('2134')
false
validateJSON('{ "Id": 1, "Name": "Coke" }')
true
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.