我的服务器端代码返回一个值,该值在成功时为json对象,在失败时返回字符串'false'。现在我该如何检查返回的值是否是json对象?
答案 0 :(得分:141)
The chosen solution实际上并不适合我,因为我得到了
"Unexpected Token <"
Chrome中的错误。这是因为一旦解析遇到并且未知字符就会抛出错误。但是,如果你只是通过ajax返回字符串值(如果你使用PHP或ASPX来处理ajax请求并且可能会或可能不会根据条件返回JSON,这可能非常有用),有一种方法可以解决这个问题。
解决方案非常简单,您可以执行以下操作来检查它是否是有效的JSON返回
var IS_JSON = true;
try
{
var json = $.parseJSON(msg);
}
catch(err)
{
IS_JSON = false;
}
正如我之前所说,如果您要么从AJAX请求返回字符串类型的东西,或者如果您要返回混合类型,那么这就是解决方案。
答案 1 :(得分:98)
jQuery.parseJSON()应返回“object”类型的对象,如果该字符串是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
}
}
答案 2 :(得分:16)
/**
* @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 = {};
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"]
如果您使用JQuery通过AJAX提供信息。我建议你在“dataType”属性中加入“json”值,这样如果你得到一个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) {}
});
答案 3 :(得分:13)
如果你有jQuery,请使用isPlainObject。
if ($.isPlainObject(my_var)) {}
答案 4 :(得分: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
答案 5 :(得分:4)
因为它只是假和json对象,为什么不检查它是否为假,否则它必须是json。
if(ret == false || ret == "false") {
// json
}
答案 6 :(得分: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];
}
答案 7 :(得分:1)
var data = 'json string ?';
var jdata = null;
try
{
jdata = $.parseJSON(data);
}catch(e)
{}
if(jdata)
{
//use jdata
}else
{
//use data
}
答案 8 :(得分:0)
如果要显式测试有效的JSON(而不是缺少返回值false
),那么您可以使用here所述的解析方法。
答案 9 :(得分:0)
我不太喜欢接受的答案。首先,它需要jQuery,这并不总是可用或需要的。其次,它对对象进行了完整的字符串化,这对我来说是过度的。这是一个简单的函数,它可以彻底检测某个值是否类似于JSON,只使用lodash库的几个部分来表示通用性。
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。与Webpack之类的内容一起使用即可在浏览器中使用它。
希望这有助于某人!
答案 10 :(得分: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;
}
答案 11 :(得分:0)
我尝试了所有建议的答案,但对我没有任何帮助,所以我不得不使用
jQuery.isEmptyObject()
hoe头可以帮助其他人解决此问题
答案 12 :(得分:-1)
您应该返回json 始终,但更改其状态,或者在以下示例中返回 ResponseCode 属性:
if(callbackResults.ResponseCode!="200"){
/* Some error, you can add a message too */
} else {
/* All fine, proceed with code */
};