अगर कोई मान एक जोंस ऑब्जेक्ट है तो मैं कैसे जांच सकता हूं?


101

मेरा सर्वर साइड कोड एक मान लौटाता है जो सफलता पर एक json ऑब्जेक्ट है और विफलता पर एक स्ट्रिंग 'गलत' है। अब मैं कैसे जांच सकता हूं कि लौटाया गया मूल्य एक जेसन ऑब्जेक्ट है या नहीं?


2
यदि यह वास्तव में "आपका" सर्वर साइड कोड है, तो इसे "कभी-कभी-यह JSON- और कभी-कभी-कभी-नहीं" स्थिति बनाने के बजाय JSON परिणाम में एक स्थिति फ़ील्ड क्यों नहीं है ...?
HostileFork का कहना है कि

डिबगिंग कारणों के लिए @Hostile। अब आप कभी भी ऐसा नहीं करते हैं कि सर्वर किस प्रकार की विफलता को फेंक देगा और उस बिंदु पर json का उपयोग नहीं किया जा रहा है।
बार्ट

1
मैं अभी भी नहीं देखता कि सर्वर प्रतिक्रिया में त्रुटि कोड (नामांकित फ़ील्ड के रूप में) को कैसे कम किया जाएगा। यह फ्रीबेस के लिए काफी अच्छा है! wiki.freebase.com/wiki/MQL_errors
HostileFork का कहना है कि

यदि आप वर्तमान में स्वीकार किए गए उत्तर को गलत मानते हैं, तो कृपया सर्गेई फेडेरोव के स्वीकृत उत्तर को बदल दें।
सर्ज सगन

"जसन ऑब्जेक्ट" क्या है? JSON स्ट्रिंग्स और JS ऑब्जेक्ट्स हैं, लेकिन "जावास्क्रिप्ट ऑब्जेक्ट नोटेशन ऑब्जेक्ट" जैसी कोई चीज नहीं है।
मपेन १६'१६

जवाबों:


105

यदि स्ट्रिंग JSON थी, तो jQuery.parseJSON () को "ऑब्जेक्ट" प्रकार की एक वस्तु वापस करनी चाहिए, इसलिए आपको केवल इस प्रकार की जांच करनी होगी 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 से पहले, $ .parseJSON ने एक त्रुटि को फेंकने के बजाय अशक्त लौटा दिया, यदि यह खाली स्ट्रिंग, अशक्त या अपरिभाषित पारित किया गया था, भले ही वे वैध JSON नहीं हैं। jquery साइट लिंक
gloomy.penguin

7
यह समाधान सबसे अच्छा नहीं है, क्योंकि वापसी "SyntaxError: JSON.parse: unexpected character"त्रुटि! , मुझे लगता है कि सबसे अच्छा समाधान है कोशिश / कैच का उपयोग करें जो यहां कहा गया Serguei Fedorovहै: stackoverflow.com/questions/4295386/…
नबी काज

2
यदि आप jquery का उपयोग नहीं करना चाहते हैं, तो आप यहां बताए अनुसार निर्माण प्रकार की जाँच करके वेनिला JS का उपयोग कर सकते हैं: stackoverflow.com/questions/11182924/…
Mat

2
यह उत्तर गलत है, सेर्गेई फेडेरोव का उत्तर स्वीकार किया गया उत्तर होना चाहिए।
सेर्गे सगन

148

चुना हुआ समाधान वास्तव में मेरे लिए काम नहीं करता है क्योंकि मुझे ए

     "Unexpected Token <" 

क्रोम में त्रुटि। ऐसा इसलिए है क्योंकि पार्स के पार और अज्ञात चरित्र आते ही त्रुटि को फेंक दिया जाता है। हालाँकि, इस के आसपास एक तरीका है यदि आप अजाक्स के माध्यम से केवल स्ट्रिंग मान वापस कर रहे हैं (जो कि काफी उपयोगी हो सकता है यदि आप ajax अनुरोधों को संसाधित करने के लिए PHP या ASPX का उपयोग कर रहे हैं और शर्तों के आधार पर JSON नहीं लौट सकते हैं)

समाधान काफी सरल है, आप यह जांचने के लिए निम्न कर सकते हैं कि क्या यह एक वैध JSON रिटर्न था

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

जैसा कि मैंने पहले कहा है, यह समाधान है यदि आप या तो अपने AJAX अनुरोध से स्ट्रिंग प्रकार का सामान वापस कर रहे हैं या यदि आप मिश्रित प्रकार लौट रहे हैं।


सवाल किसी भी बिंदु पर गैर-JSON-स्ट्रिंग्स के बारे में नहीं है। सर्वर हमेशा एक वैध JSON देता है (एक स्ट्रिंग falseभी वैध JSON है)। सवाल केवल एक बिंदु के बारे में है: यदि पार्स किया गया JSON-स्ट्रिंग एक बूलियन falseया ऑब्जेक्ट है तो अंतर कैसे करें
Dr.Molle

2
प्रदर्शन का विचार: इसे एक फंक्शन में रैप करना, दो बार जोंस को पार्स न करना सुनिश्चित करें (एक बार ट्रायल कैच के अंदर, और एक बार कोड में जो फ़ंक्शन को कॉल करता है।)
मिकिएल कॉर्निल

यह एक हेल्पर्स फंक्शन हैजसन () जो आप उपयोग कर सकते हैं isJSON(someValue):।
22

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

समाधान २

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

लेकिन, कड़ाई से बोलते हुए, एक सरणी JSON सिंटैक्स का हिस्सा है। इसलिए, निम्नलिखित दो उदाहरण JSON प्रतिक्रिया का हिस्सा हैं:

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 (अनुशंसित)

यदि आप AJAX के माध्यम से जानकारी लाने के लिए JQuery का उपयोग करते हैं। मैं आपको "डेटा टाइप" में डालकर "जोंस" मान को रखने की सलाह देता हूं, इस तरह अगर आपको JSON मिलता है या नहीं, 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 है, तो PlainObject का उपयोग करें

if ($.isPlainObject(my_var)) {}

5
यदि आप एक स्ट्रिंग पर .PainObject का उपयोग करते हैं, तो यह गलत है, जैसे jQuery.isPlainObject ('{}')
रॉय शोए

अधिक महत्वपूर्ण बात यह है कि यदि इसमें एक गैर-JSON जैसी संपत्ति शामिल है, तो डॉक्स के अनुसार यह फ़ंक्शन अभी भी वापस आ जाएगा 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

चूँकि यह सिर्फ झूठी और json वस्तु है, आप इसकी जाँच क्यों नहीं करते कि क्या यह झूठा है, अन्यथा यह json होना चाहिए।

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
}

मैंने इसे npm में एक पैकेज के रूप में डालने का समय भी लिया है: 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

आपको हमेशा जसन लौटाना चाहिए , लेकिन उसकी स्थिति बदलनी चाहिए , या निम्नलिखित उदाहरण में ResponseCode प्रॉपर्टी:

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

@ बर्ट, आप बस वस्तु प्रदान कर सकते हैं यदि इस स्थिति में, वह चेक करेगा।
कोबे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.