javascript - 你怎么知道一个对象是否是javascript中的JSON?

标签 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/

相关文章:

javascript - 未选中复选框时从数组中删除元素(过滤方法不起作用?)

javascript - 根据条件调用另一个组件中的函数,无论选项卡是否处于事件状态

javascript - 我们可以使用 javascript 从母版页访问内容页元素吗?

适用于智能手机的 jQuery Accordion

php - 通过 Ajax 调用加载 Zend 表单

javascript - 使用 rows.add 将 JSON 信息添加到数据表

json - swagger-ui 和动态主机名

javascript - 在 JavaScript 中捕获特定异常

c# - 反序列化 json 数组以列出 wp7

javascript - 单击时菜单的水平移动