JSON.stringify(), 将value(Object,Array,String,Number...)序列化为JSON字符串 JSON.parse(), 将JSON数据解析为js原生值 toJSON(), 做为JSON.stringify中第二个参数(函数过滤器)补充 支持 IE8+,FF3.5+,safari4+,opera10.5+,chrome // * ===================ECMAscript5 全局对象JSON===================== * Json:只是一种轻量级的数据格式。使用js syntax的子集表示对象、数组、字符串、数值、布尔值、和null * Note:ECMAScript5 定义了一个原生的JSON对象, 用来将对象序列化为JSON字符串(JSON.stringify()), 或者将JSON数据解析为js对象(JSON.parse())。 * support: IE8+,FF3.5+,safari4+,opera10.5+,chrome * IE6,7 : https://github.com/douglascrockford/JSON-js // // * JSON.stringify() * @specify : serialization(序列化) * @method : JSON.stringify(value,filter,indent); * @return : JSON字符串 * @param : value {type : String|Object|String|Number|Boolean|null} {explain : 传入的类型能够是列出的這些} * @param : filter : {type : []|{}} {explain : 过滤器能够是个数组,也能够是个函数} * @param : indent : {type : Number | 特殊符号} {explain : 若是是数字则表明空白符的个数,最多10个;也能够直接传入缩进的符号} // var gather = { id : 1314, name : 'pom', infor : { age : 20, sex : 'man', marry : false, identity : 622421, habit : ['篮球','台球','乒乓球','游戏',true] }, family : ['妈妈','爸爸','弟弟'], likeGames : ['PCgame','Netgame'] }; var jsonText = JSON.stringify(gather,null,4); //第二个参数是数组,只会序列化返回数组里列出的名称 var jsonText1 = JSON.stringify(gather,['id','family'],'='); var jsonText2 = JSON.stringify(gather,function(key,val){ switch(key){ case 'id' : return 'id is ' + val; case 'family' : return val.join('@'); case 'infor' : //infor的val 还可使用JSON.stringify() //return JSON.stringify(val,["age","sex"]); return Object.prototype.toString.call(val).slice(8, -1); case 'likeGames' : //经过返回undefined删除该属性 return undefined; //必定要default,以便传入的其余值能正常的返回到序列化结果中。 default : return val; } },10); // console.log(jsonText); // console.log(jsonText1); // console.log(jsonText2) // * toJSON() * @specify : JSON.stringify()不能知足对某些对象进行自定义序列化的需求,能够经过对象那个上调用toJSON()方法 * @method : date.toJSON() * @return : 返回任何序列化的值。 * * JSON.parse() ,eval_r() 也能够解析 并返回js对象和数组等。但IE8如下浏览器会有安全隐患。 * @specify : 将json字符串解析为原生的javascript值。 * @method : JSON.parse(val,replacer) * @param : val{type : String} {explain : 须要解析的json字符串} * @param : replacer {type : function} {explain : 和JSON.stringify()第二个参数相似,接受2个参数,key,val,不过是用来还原json串的函数} // var products = { name : "leading", "time" : new Date(2012,03,1), toJSON : function(){ //只返回name return this.name; } } var proStr = JSON.stringify(products); console.log(proStr); //obj中的relaeseDate对象序列化以后成了有效的json串 var obj = { title : '对象的标题', type : 'primitive' , releaseDate : new Date(2012,03,1) }; //转化为json串 var o = JSON.stringify(obj); console.log(o); //在parsedO中还原为一个Date对象(会基于相应的值建立一个新的Date对象,结果parsedO.releaseDate属性中保存了一个Date对象) var parsedO = JSON.parse(o,function(k,v){ if(k == 'releaseDate'){ return new Date(v); }else{ return v; } }); console.log(parsedO); //能够调用getFullYear() console.log(parsedO.releaseDate.getFullYear()); //2012 执行原理: toJSON() 做为JSON.stringify中第二个参数(函数过滤器)补充,理解内部顺序很重要。 假设把一个对象传入JSON.stringify() 序列化对象的顺序以下: (1) 若是存在toJSON()方法并且能经过它取得有效的值,则调用该方法。不然,按默认顺序执行序列化 (2) 若是提供了第二个参数,应用这个函数过滤器,传入的函数过滤器的值是第(1)步返回的值。 (3) 对第(2)步 返回的每一个值进行相应的序列化。 (4) 若是提供了第三个参数,执行相应的格式化操做。