<分区>
我如何知道变量是 JSON 还是其他变量?是否有 JQuery 函数或其他我可以用来解决这个问题的函数?
标签 javascript jquery json
<分区>
我如何知道变量是 JSON 还是其他变量?是否有 JQuery 函数或其他我可以用来解决这个问题的函数?
最佳答案
根据您的意见,听起来您不想知道一个字符串是否是有效的 JSON,而是想知道一个对象是否可以成功编码为 JSON(例如,不包含任何 Date 对象、用户实例 -定义的类等)。
这里有两种方法:尝试分析对象及其“子对象”(注意递归对象)或一试再看。如果您手头有一个 JSON 编码器(在最近的浏览器中为 JSON.stringify
或一个插件,例如 jquery-json ),后者可能是更简单和更可靠的方法:
function canJSON(value) {
try {
JSON.stringify(value);
return true;
} catch (ex) {
return false;
}
}
直接分析对象需要您能够判断它是否是“普通”对象(即使用对象字面量或 new Object()
创建),这反过来又需要您能够获得它的原型(prototype),这并不总是那么简单。我发现以下代码适用于 IE7、FF3、Opera 10、Safari 4 和 Chrome(很可能还有这些浏览器的其他版本,我只是没有测试过)。
var getPrototypeOf;
if (Object.getPrototypeOf) {
getPrototypeOf = Object.getPrototypeOf;
} else if (typeof ({}).__proto__ === "object") {
getPrototypeOf = function(object) {
return object.__proto__;
}
} else {
getPrototypeOf = function(object) {
var constructor = object.constructor;
if (Object.prototype.hasOwnProperty.call(object, "constructor")) {
var oldConstructor = constructor; // save modified value
if (!(delete object.constructor)) { // attempt to "unmask" real constructor
return null; // no mask
}
constructor = object.constructor; // obtain reference to real constructor
object.constructor = oldConstructor; // restore modified value
}
return constructor ? constructor.prototype : null;
}
}
// jQuery.isPlainObject() returns false in IE for (new Object())
function isPlainObject(value) {
if (typeof value !== "object" || value === null) {
return false;
}
var proto = getPrototypeOf(value);
// the prototype of simple objects is an object whose prototype is null
return proto !== null && getPrototypeOf(proto) === null;
}
var serializablePrimitives = { "boolean" : true, "number" : true, "string" : true }
function isSerializable(value) {
if (serializablePrimitives[typeof value] || value === null) {
return true;
}
if (value instanceof Array) {
var length = value.length;
for (var i = 0; i < length; i++) {
if (!isSerializable(value[i])) {
return false;
}
}
return true;
}
if (isPlainObject(value)) {
for (var key in value) {
if (!isSerializable(value[key])) {
return false;
}
}
return true;
}
return false;
}
是的……我推荐 try/catch 方法。 ;-)
关于javascript - 你怎么知道一个对象是否是javascript中的JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481614/