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

时间:2010-03-20 02:03:51

标签: javascript jquery json

我如何知道变量是JSON还是其他东西?是否有一个JQuery函数或者我可以用来解决这个问题的东西?

5 个答案:

答案 0 :(得分:15)

根据您的评论,听起来您不想知道字符串是否是有效的JSON,而是一个对象是否可以成功编码为JSON(例如,不包含任何Date对象,用户实例 - 定义的类等。)。

这里有两种方法:尝试分析对象及其“子”(注意递归对象)或者吮吸它。如果你手头有一个JSON编码器(JSON.stringify在最近的浏览器中或者插件如jquery-json),后者可能是更简单,更强大的方法:

function canJSON(value) {
    try {
        JSON.stringify(value);
        return true;
    } catch (ex) {
        return false;
    }
}

直接分析对象要求您能够判断它是否是“普通”对象(即使用对象文字或new Object()创建),这反过来要求您能够获得其原型,并不总是直截了当的。我发现以下代码可以在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方法。 ; - )

答案 1 :(得分:8)

function isJSON(data) {
    var isJson = false
    try {
        // this works with JSON string and JSON object, not sure about others
       var json = $.parseJSON(data);
       isJson = typeof json === 'object' ;
    } catch (ex) {
        console.error('data is not JSON');
    }
    return isJson;
}

答案 2 :(得分:3)

使用json2.js解析它。

答案 3 :(得分:1)

JSON是一种编码方法,而不是内部变量类型。

您可能会加载一些JSON编码的文本,然后javascript会用来填充您的变量。或者您可以导出包含JSON编码数据集的字符串。

答案 4 :(得分:-1)

我所做的唯一测试是检查字符串,有和没有双引号,这通过了该测试。 http://forum.jquery.com/topic/isjson-str

编辑: 看起来最新的Prototype有一个类似于上面链接的新实现。 http://prototypejs.org/assets/2010/10/12/prototype.js

function isJSON() {
var str = this;
if (str.blank()) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);

}