কোনও মান একটি জসন বস্তু কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


101

আমার সার্ভার সাইড কোডটি এমন একটি মান দেয় যা সাফল্যের উপর একটি জসন বস্তু এবং ব্যর্থতায় স্ট্রিং 'মিথ্যা'। এখন আমি কীভাবে যাচাই করতে পারি যে প্রত্যাবর্তিত মানটি একটি জাসন বস্তু কিনা?


2
যদি এটি আসলে "আপনার" সার্ভার সাইড কোড হয় তবে জাসন ফলাফলের স্থিতি ক্ষেত্র কেন এই "কখনও কখনও এটি-জেএসএন-এবং-কখনও-কখনও-এটি-না" পরিস্থিতি তৈরি করার পরিবর্তে থাকবে ...?
হোস্টাইলফোর্ক বলেছেন যে এসই

ডিবাগিং কারণে @ হোস্টাইল আপনি এখনই সার্ভারটি কোন ধরণের ব্যর্থতা ফেলবেন এবং সেই সময়ে জেসন ব্যবহার করা হচ্ছে না।
বার্ট

1
আমি এখনও দেখতে পাচ্ছি না যে সার্ভারের প্রতিক্রিয়াতে একটি ত্রুটি কোড (নামযুক্ত ক্ষেত্র হিসাবে) কীভাবে হ্রাস করবে। এটি ফ্রিবেসের পক্ষে যথেষ্ট ভাল! wiki.freebase.com/wiki/MQL_erferences
হোস্টাইলফোর্ক বলেছেন

সের্গেই ফেদেরভের গৃহীত উত্তরটি পরিবর্তন করুন, যদি আপনি বর্তমানে গ্রহণযোগ্য উত্তরটি ভুল করতে পারেন তবে।
সেরজ সাগান

"জসন অবজেক্ট" কী? এখানে জেএসএন স্ট্রিং এবং জেএস অবজেক্ট রয়েছে তবে "জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন অবজেক্ট" এর মতো কোনও জিনিস নেই।
এমপেন

উত্তর:


105

jQuery.parseJSON () "অবজেক্ট" টাইপের একটি অবজেক্ট ফিরিয়ে আনতে হবে, যদি স্ট্রিংটি JSON ছিল, সুতরাং আপনাকে কেবল প্রকারটি পরীক্ষা করতে হবে typeof

var response=jQuery.parseJSON('response from server');
if(typeof response =='object')
{
  // It is JSON
}
else
{
  if(response ===false)
  {
     // the response was a string "false", parseJSON will convert it to boolean false
  }
  else
  {
    // the response was something else
  }
}

29
যদি সম্ভব হয় যে পার্সজেসন জেএসওএন মান (যেমন এইচটিএমএল) ব্যতীত অন্য কোনও কিছু নিয়ে কাজ করছে
ব্যর্থতার

2
JQuery 1.9 এর আগে, পার্সজেএসএসন যদি কোনও শূন্য স্ট্রিং, নাল বা অপরিজ্ঞাত করা হয় তবে তা ত্রুটি ছুঁড়ে ফেলার পরিবর্তে নਾਲ ফিরে আসল, যদিও সেগুলি বৈধ JSON নয়। jquery সাইটের লিঙ্ক
gloomy.penguin

7
এই সমাধানটি সেরা নয়, কারণ রিটার্ন "SyntaxError: JSON.parse: unexpected character"ত্রুটি! , আমি মনে করি সেরা সমাধানটি চেষ্টা / ক্যাপচার ব্যবহার যা Serguei Fedorovএখানে বলেছিল : স্ট্যাকওভারফ্লো
নবী কেএজেড

2
আপনি যদি jquery ব্যবহার করতে না চান, আপনি এখানে বর্ণিত কনস্ট্রাক্টর প্রকারটি পরীক্ষা করে ভ্যানিলা জেএস ব্যবহার করতে পারেন: stackoverflow.com/questions/11182924/…
মাদুর

2
এই উত্তরটি ভুল, সের্গেই ফেদেরভের উত্তরটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
সেরজ সাগান

148

নির্বাচিত সমাধানটি আসলে আমার পক্ষে কাজ করে না কারণ আমি একটি পাই

     "Unexpected Token <" 

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

সমাধানটি বেশ সহজ, আপনি বৈধ JSON রিটার্ন ছিল কিনা তা পরীক্ষা করতে নিম্নলিখিতটি করতে পারেন

       var IS_JSON = true;
       try
       {
               var json = $.parseJSON(msg);
       }
       catch(err)
       {
               IS_JSON = false;
       }                

যেমনটি আমি আগেই বলেছি, এটি সমাধান যদি আপনি হয় আপনার এজেএক্স অনুরোধ থেকে স্ট্রিং টাইপ স্টাফগুলি ফিরিয়ে দিচ্ছেন বা আপনি যদি মিশ্র প্রকারটি ফিরিয়ে দিচ্ছেন।


প্রশ্নটি কোনও বিন্দুতে নন-জেএসএন-স্ট্রিং সম্পর্কে নয়। সার্ভার সর্বদা একটি বৈধ JSON দেয় (একটি স্ট্রিংও falseবৈধ JSON) ON প্রশ্নটি কেবলমাত্র একটি বিন্দু সম্পর্কে: পার্সড জেএসওএন-স্ট্রিং যদি কোনও বুলিয়ান falseবা কোনও বস্তু হয় তবে কীভাবে পার্থক্য করবেন
ডক্টর মোল

2
পারফরম্যান্স বিবেচনা: একটি ফাংশনে এটিকে জড়িয়ে রাখার জন্য, দু'বার জেএসনকে পার্স না করার বিষয়টি নিশ্চিত করুন (একবার চেষ্টা করার পরে, এবং ফাংশনটি কল করে এমন কোডে একবার))
মিশেল কর্নিল

এটা একটা সাহায্যকারী ফাংশনের isJSON () যা আপনি ব্যবহার করতে পারেন: isJSON(someValue)
চৌফোটেডি

19

সমাধান 3 (দ্রুততম উপায়)

/**
 * @param Object
 * @returns boolean
 */
function isJSON (something) {
    if (typeof something != 'string')
        something = JSON.stringify(something);

    try {
        JSON.parse(something);
        return true;
    } catch (e) {
        return false;
    }
}

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

var myJson = [{"user":"chofoteddy"}, {"user":"bart"}];
isJSON(myJson); // true

কোনও বস্তুটি JSON বা অ্যারে প্রকারের যাচাই করার সর্বোত্তম উপায়টি নিম্নরূপ:

var a = [],
    o = {};

সমাধান 1

toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true

সমাধান 2

a.constructor.name === 'Array'; // true
o.constructor.name === 'Object'; // true

তবে, কঠোরভাবে বলতে গেলে, একটি অ্যারে জেএসএন সিনট্যাক্সের অংশ। অতএব, নিম্নলিখিত দুটি উদাহরণ একটি জেএসএন প্রতিক্রিয়ার অংশ:

console.log(response); // {"message": "success"}
console.log(response); // {"user": "bart", "id":3}

এবং:

console.log(response); // [{"user":"chofoteddy"}, {"user":"bart"}]
console.log(response); // ["chofoteddy", "bart"]

AJAX / JQuery (প্রস্তাবিত)

আপনি যদি এজেএক্সের মাধ্যমে তথ্য আনতে JQuery ব্যবহার করেন। আমি আপনাকে "ডাটা টাইপ" বৈশিষ্ট্যটি "জসন" মানটিতে রাখার পরামর্শ দিচ্ছি, আপনি যদি কোনও জেএসওএন পান বা না পান, জিকুয়ারি এটি আপনার জন্য বৈধতা দেয় এবং তাদের কার্যকারিতা "সাফল্য" এবং "ত্রুটি" এর মাধ্যমে জানিয়ে দেয়। উদাহরণ:

$.ajax({
    url: 'http://www.something.com',
    data: $('#formId').serialize(),
    method: 'POST',
    dataType: 'json',
    // "sucess" will be executed only if the response status is 200 and get a JSON
    success: function (json) {},
    // "error" will run but receive state 200, but if you miss the JSON syntax
    error: function (xhr) {}
});

13

আপনার যদি jQuery থাকে তবে isPlainObject ব্যবহার করুন

if ($.isPlainObject(my_var)) {}

5
আপনি যদি স্ট্রিংয়ে আইপ্লেইন অবজেক্ট ব্যবহার করেন তবে এটি মিথ্যা প্রত্যাবর্তন করে, যেমন jQuery.isPlainObject ('{}')
রায় শোয়া

আরও গুরুত্বপূর্ণ বিষয়, যদি এটিতে সম্পত্তি হিসাবে একটি নন-জেএসওএন-এর মতো মান থাকে তবে ডক্স অনুসারে এই ফাংশনটি এখনও ফিরে আসবে true
samvv

6
var checkJSON = function(m) {

   if (typeof m == 'object') { 
      try{ m = JSON.stringify(m); }
      catch(err) { return false; } }

   if (typeof m == 'string') {
      try{ m = JSON.parse(m); }
      catch (err) { return false; } }

   if (typeof m != 'object') { return false; }
   return true;

};


checkJSON(JSON.parse('{}'));      //true
checkJSON(JSON.parse('{"a":0}')); //true
checkJSON('{}');                  //true
checkJSON('{"a":0}');             //true
checkJSON('x');                   //false
checkJSON('');                    //false
checkJSON();                      //false

4

যেহেতু এটি কেবল মিথ্যা এবং জসন অবজেক্ট, আপনি কেন এটি মিথ্যা কিনা তা যাচাই করেন না, অন্যথায় এটি অবশ্যই জসন হতে হবে।

if(ret == false || ret == "false") {
    // json
}

2

আমি জানি এই থ্রেডটির উত্তর ইতিমধ্যে দেওয়া হয়েছে, তবে এখানে আসার ফলে আমার সমস্যার সমাধান হয়নি, আমি এই ফাংশনটি অন্য কোথাও পেয়েছি। সম্ভবত এখানে আসা যে কেউ এটি তাদের কিছু কাজে লাগবে;

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}


0

আপনি যদি বৈধ JSON (প্রত্যাবর্তিত মূল্যের অনুপস্থিতির বিপরীতে) এর জন্য স্পষ্টভাবে পরীক্ষা করতে চান falseতবে আপনি এখানে বর্ণিত হিসাবে পার্সিং পদ্ধতির ব্যবহার করতে পারেন ।


0

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

import * as isNull from 'lodash/isNull'
import * as isPlainObject from 'lodash/isPlainObject'
import * as isNumber from 'lodash/isNumber'
import * as isBoolean from 'lodash/isBoolean'
import * as isString from 'lodash/isString'
import * as isArray from 'lodash/isArray'

function isJSON(val) {
  if (isNull(val)
   || isBoolean(val)
   || isString(val))
    return true;
  if (isNumber(val)) 
     return !isNaN(val) && isFinite(val)
  if (isArray(val))
    return Array.prototype.every.call(val, isJSON)
  if (isPlainObject(val)) {
    for (const key of Object.keys(val)) {
      if (!isJSON(val[key]))
        return false
    }
    return true
  }
  return false
}

এমনকি এটি প্যাকেজ হিসাবে এনপিএম-এ রাখার জন্য আমি সময়ও নিয়েছি: https://npmjs.com/package/is-json-object । এটি ব্রাউজারে পেতে ওয়েবপ্যাকের মতো কোনও কিছুর সাথে একসাথে ব্যবহার করুন ।

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


0

আমি JSON অবজেক্টটি বৈধ করার জন্য এটি ব্যবহার করছি

function isJsonObject(obj) {
    try {
        JSON.parse(JSON.stringify(obj));
    } catch (e) {
        return false;
    }
    return true;
}

আমি JSON স্ট্রিং যাচাই করতে এটি ব্যবহার করছি

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

0

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

jQuery.isEmptyObject()

নিড়ানি যা এই সমস্যাটি নিয়ে অন্য কাউকে সাহায্য করে


-1

আপনার সবসময় জসনকে ফিরে আসা উচিত , তবে এর স্থিতি পরিবর্তন করুন বা উদাহরণস্বরূপ রেসপন্সকোড সম্পত্তি:

if(callbackResults.ResponseCode!="200"){
    /* Some error, you can add a message too */
} else {
    /* All fine, proceed with code */
};

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