eval、JSON.parse和JSON.stringify
早期的JSON解析器基本上就是使用JavaScript的eval()函数。由于JSON是JavaScript语法的自己,因此eval()函数可以解析、解释并返回JavaScript的对象和数组。ECMAScript 5对解析JSON的行为进行了规范,定义了全局对象JSON。 JSON对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScriptevaleval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。说明 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。 如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。 使用示例: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="Scripts/jquery-2.1.0.js"></script> <script type="text/javascript"> function GoHome() { alert("go home"); } $(function () { var toolbar = { "name": { "key":"abc" } } var str = "toolbar.name.key"; alert(eval(str));//解析为json的值 $("button").click(function () { var r = "GoHome()"; eval(r);//执行方法 }); eval("x=10;y=20;document.write(x*y)") //JSON格式: /* (1) 单个对象{"变量名1":"变量值1","变量名2":"变量值2"} (2) 数组[{ "变量名11":"变量值1","变量名12":"变量值2" },{ "变量名21":"变量值1","变量名22":"变量值2" },{ "变量名31":"变量值1","变量名32":"变量值2" }] */ //情况一: var t = '{"Name":"xiao","Sex":"man"}'; var d = eval('(' + t + ')'); //alert(d["Name"]);//弹出xiao //情况二: var t1 = '[{"Name":"zhang","Sex":"Man"},{"Name":"Wang","Sex":"Female"}]'; var d1 = eval('(' + t1 + ')'); alert(d1[0]["Name"]); }); </script> </head> <body> <button>Go</button> </body> </html> JSON.parse
//parse 用于从字符串解析出json对象, // 一个参数 var Student = { age: "20",sex: "male" }; var jsonString = JSON.stringify(Student); var obj = JSON.parse(jsonString); alert(obj.age); //注意:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。 var str = '{"name:"xiaowang","age":"23"}'; var result = JSON.parse(str); alert(result.age); //两个参数 var student = { name: "xiao",age:"20" } var jsonstu = JSON.stringify(student); var stuObj = JSON.parse(jsonstu,function (key,value) { if (key == "age") { return 22; } else { return value; } }); alert(stuObj.name); alert(stuObj.age); JSON.stringify
/* * 只有第一个参数 */ var Student = { age: "20",sex:"male" }; //stringify()用于从一个对象解析出字符串 var jsonString = JSON.stringify(Student); alert(jsonString); var person = new Object(); person.name = "xiao wang"; person.age = "20"; person.location = "china"; var personjson = JSON.stringify(person); alert(personjson); /* * 有两个参数,第一个参数是对象,第二个参数是数组 */ var person = new Object(); person.name = "xiao wang"; person.age = "20"; person.location = "china"; var filter = ["name"]; var personjson = JSON.stringify(person,filter); alert(personjson); /* * 有两个参数,第一个参数是数组,第二个参数是数组(计算结果是第二个参数忽略) */ var person = ["zhangsan","20","male","china"]; var filter = ["zhangsan","china"]; var jsonperson = JSON.stringify(person,filter); alert(jsonperson); /* * 有两个参数,第一个参数是数组,第二个参数是函数 */ function switchUpper(key,value) { return value.toString().toUpperCase(); } var person = ["zhangsan","china"]; var jsonperson = JSON.stringify(person,switchUpper); alert(jsonperson); /* *有两个参数,第一个参数是对象,第二个参数是函数 */ var person = new Object(); person.name = "xiao wang"; person.age = "20"; person.location = "china"; var jsonperson = JSON.stringify(person,value) { switch (key) { case "name": return "zhang"; default: return value; } }); alert(jsonperson); /* * 有三个参数,如果省略的话,那么显示出来的值就没有分割符, * 如果是数组的话,那么它定义缩进的字符,如果大于10,则最多显示10个 * 如果是一些转义字符,如"t",表示回车,那么它每一行一个回车 * 如果仅仅是字符串,就在每行输出值得时候把这些字符串附加上去,当然最大长度是10个字符 */ //空格 var person = ["name","age","sex","location"]; var jsonperson = JSON.stringify(person,null,20); alert(jsonperson); //字符 var person = ["name","hi"); alert(jsonperson); toJSON
var student = { name: "xiao",age: "20",sex: "male",toJSON: function () { return this.name + "_" + this.age; } } var jsonstu = JSON.stringify(student); alert(jsonstu); var student = { name: "xiao",toJSON: function () { return this.name + "_" + this.age; } } var jsonstu = JSON.stringify(student,value) { return value;//value = "name_20" }); alert(jsonstu);以上代码在student对象上定义了一个toJSON()方法,该方法返回name和id的组合。最后jsonText的值如下: "xiao_20" toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify(),序列化该对象的顺序是: (1)如果存在toJSON()方法而且能够通过它取得有效值,则调用该方法。否则,按默认顺序执行序列化。 (2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。 (3)对第(2)步返回的每个值进行相应的序列化。 (4)如果提供了第三个参数,执行相应的格式化。 无论是考虑滴定toJSON()方法,还是考虑使用函数过滤器,或者需要同时使用两者,理解这个顺序都是至关重要的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |