我的服务器端代码返回一个值,该值成功时为json对象,失败时为字符串'false'。现在如何检查返回的值是否为json对象?
我的服务器端代码返回一个值,该值成功时为json对象,失败时为字符串'false'。现在如何检查返回的值是否为json对象?
Answers:
如果字符串是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
}
}
"SyntaxError: JSON.parse: unexpected character"
错误!,我认为最好的解决办法是使用try / catch语句,通过说Serguei Fedorov
在这里:stackoverflow.com/questions/4295386/...
所选的解决方案实际上不适用于我,因为我得到了
"Unexpected Token <"
Chrome中的错误。这是因为一旦遇到解析和未知字符,就会引发错误。但是,如果您仅通过ajax返回字符串值,则有一种解决方法(如果您使用PHP或ASPX处理ajax请求,并且根据条件可能会或可能不会返回JSON时,这将非常有用)
解决方案非常简单,您可以执行以下操作以检查其是否为有效的JSON返回值
var IS_JSON = true;
try
{
var json = $.parseJSON(msg);
}
catch(err)
{
IS_JSON = false;
}
如前所述,这是解决方案,无论您是从AJAX请求返回字符串类型的东西,还是返回混合类型的东西。
false
也是有效的JSON)。问题仅涉及一点:如何区分已解析的JSON字符串是布尔值false
还是对象
isJSON(someValue)
。
/**
* @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都会为您验证它并通过其函数“ 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) {}
});
如果您有jQuery,请使用isPlainObject。
if ($.isPlainObject(my_var)) {}
true
。
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
我知道这个线程已经被回答了,但是来到这里并没有真正解决我的问题,我在其他地方找到了这个功能。也许有人来这里会发现它对他们有用。
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
}
我真的不喜欢被接受的答案。首先,它需要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等一起使用,可以在浏览器中获取它。
希望这对某人有帮助!
我正在使用它来验证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;
}
我尝试了所有建议的答案,但对我没有用,所以我不得不使用
jQuery.isEmptyObject()
helps头可以帮助别人解决这个问题