我怎样才能检查一个值是一个JSON对象?

我的服务器端代码返回一个成功的json对象的值,失败时返回一个string“false”。 现在我怎样才能检查返回的值是否是json对象?

jQuery.parseJSON()应该返回一个types为“object”的对象,如果string是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 } } 

所选的解决scheme实际上并不适合我,因为我得到了一个

  "Unexpected Token <" 

Chrome中出现错误。 这是因为一旦parsing遇到错误并且出现未知字符,就会抛出错误。 但是,如果仅通过ajax返回string值(如果您使用PHP或ASPX处理ajax请求,并且可能会或可能不会根据条件返回JSON,这会非常有用)

解决scheme非常简单,您可以执行以下操作来检查它是否是有效的JSON返回

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

正如我之前所说,这是如果您要从AJAX请求返回stringtypes的东西,或者如果您返回混合types的解决scheme。

如果你有jQuery,使用isPlainObject 。

 if ($.isPlainObject(my_var)) {} 

validation对象是JSON或数组types的最佳方法如下所示:

 var a = [], o = {}; 

解决scheme1

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

解决scheme2

 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"] 

即使是一个简单的布尔运算符或一个整数在JSON的语法中也可以被认为是有效的。 这将导致我们更多的validation。 因此,检查是否有任何JSON语法是最可行的,方法是:

解决scheme3

 function isJSON (something) { if (typeof something != 'string') something = JSON.stringify(something); try { JSON.parse(something); return true; } catch (e) { return false; } } 

AJAX / JQuery

如果您使用JQuery通过AJAX提供信息。 我build议你在“dataType”属性中join“json”值,这样,如果你得到了一个JSON,JQuery会为你validation,并通过它们的函数“success”和“error”使它知道。 例:

 $.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) {} }); 
 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 

既然只是false和json对象,为什么不检查是否是false,否则一定是json。

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

我知道这个线程已经得到了回答,但来到这里并没有真正解决我的问题,我发现这个function在别的地方。 也许有人来这里会发现它对他们有一些用处;

 function getClass(obj) { if (typeof obj === "undefined") return "undefined"; if (obj === null) return "null"; return Object.prototype.toString.call(obj) .match(/^\[object\s(.*)\]$/)[1]; } 
 var data = 'json string ?'; var jdata = null; try { jdata = $.parseJSON(data); }catch(e) {} if(jdata) { //use jdata }else { //use data } 

如果你想显式testing有效的JSON(而不是没有返回值false ),那么你可以使用这里描述的parsing方法。

你应该总是返回json,但是改变它的状态 ,或者在下面的示例ResponseCode属性中:

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