Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道对象在javascript中是否为JSON?_Javascript_Jquery_Json - Fatal编程技术网

如何知道对象在javascript中是否为JSON?

如何知道对象在javascript中是否为JSON?,javascript,jquery,json,Javascript,Jquery,Json,如何知道变量是JSON还是其他变量?是否有JQuery函数或我可以使用的东西来解决这个问题?您可以使用[json2.js]from来解析它。JSON是一种编码方法,而不是内部变量类型 您可以加载一些JSON编码的文本,然后javascript使用这些文本填充变量。或者您可以导出一个包含JSON编码数据集的字符串。我所做的唯一测试是检查一个带双引号和不带双引号的字符串,并通过该测试 编辑: 看起来最新的原型有一个类似于上面链接的新实现 }根据您的评论,听起来您不想知道字符串是否是有效的JSON,而

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

您可以使用[json2.js]from来解析它。

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


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

我所做的唯一测试是检查一个带双引号和不带双引号的字符串,并通过该测试

编辑: 看起来最新的原型有一个类似于上面链接的新实现


}

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

这里有两种方法:尝试分析对象及其“子对象”(注意递归对象)或吸取它并查看。如果您手头有一个JSON编码器(
JSON.stringify
在最近的浏览器或插件中),后者可能是更简单、更健壮的方法:

function canJSON(value) {
    try {
        JSON.stringify(value);
        return true;
    } catch (ex) {
        return false;
    }
}
直接分析一个对象需要您能够判断它是否是一个“普通”对象(即使用对象文字或
新对象()
)创建的对象),这反过来需要您能够得到它的原型,这并不总是简单的。我发现以下代码可以在IE7、FF3、Opera 10、Safari 4和Chrome(很可能还有这些浏览器的其他版本,我只是没有测试过)

var-getPrototypeOf;
if(Object.getPrototypeOf){
getPrototypeOf=Object.getPrototypeOf;
}else if(typeof({})。\uuuuuu proto\uuuuuuu==“object”){
getPrototypeOf=函数(对象){
返回对象;
}
}否则{
getPrototypeOf=函数(对象){
var构造函数=object.constructor;
if(Object.prototype.hasOwnProperty.call(对象,“构造函数”)){
var oldConstructor=constructor;//保存修改后的值
如果(!(delete object.constructor)){//尝试“取消屏蔽”实际构造函数
返回null;//无掩码
}
constructor=object.constructor;//获取对实构造函数的引用
object.constructor=oldConstructor;//还原修改的值
}
返回构造函数?constructor.prototype:空;
}
}
//jQuery.isPlainObject()在IE中为(新对象()返回false)
函数isPlainObject(值){
如果(值的类型!==“对象”||值===null){
返回false;
}
var proto=getPrototypeOf(值);
//简单对象的原型是原型为空的对象
return proto!==null&&getPrototypeOf(proto)==null;
}
var serializablePrimitives={“boolean”:true,“number”:true,“string”:true}
函数可序列化(值){
if(serializablePrimitives[typeof value]| | value==null){
返回true;
}
if(数组的值实例){
变量长度=value.length;
对于(变量i=0;i

因此,是的……我建议采用“尝试/抓住”的方法。;-)

这几乎奏效了。。。如果将var json={“test”:“test”}传递给它。。这行不通。。所以如果你对它进行严格化。。它将通过验证,但如果您向它传递一个普通字符串(“asdf”)。。它不会出错吗?!我认为这个想法是让它在发送到json2.js的JSON.parse.Hm之前通过isJSON。。。奇怪。。。我使用了这个示例,它对我来说很好(PHP的
JSON_encode
中的JSON对象传递为有效),但它对示例字符串不起作用:
{“Id”:1,“Name”:“Coke”}
。它为我返回
false
。-1:不可能,你可以在纯JavaScript中使用这个函数!没有为
String
定义像
blank()
这样的函数。我也不知道,您希望如何在非对象函数定义上使用面向对象的方法(
var str=this
)?很好!1) .blank()来自Prototype-他们扩展了字符串以包含此内容。2) 该函数假定您正在执行类似的操作,并且该函数是object.Interresting的一部分。我读他的问题的方式,他似乎在寻找一个“isJSON”函数,与你从他的问题中所理解的完全相反。@ychaouche-是的,我发现这个问题很模糊。然而,James在评论中提到“将[ing]
var json={“test”:“test”}
传递给它”,我认为这意味着他想要输入一个对象。由于他从未接受过回答,我怀疑我们是否能确定他想要什么
function canJSON(value) {
    try {
        JSON.stringify(value);
        return true;
    } catch (ex) {
        return false;
    }
}
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;
}
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;
}