JSON

序列化带函数的JSON对象,让英雄做个完整的男人

字号+ 作者:H5之家 来源:H5之家 2017-05-25 09:00 我要评论( )

[通过chrome查看response object内部结构]:FB.api(

var oHero = {
name: 'zjx',
age: 27,
getSkill: function(type){ if(type == 'strength') console.debug('开山劈石掌'); }
};
console.debug(JSON.stringify(oHero);
// 输出:{"name":"zjx","age":27}

时空传送器除了故障,英雄出了时空门之后所有技能消失,英雄变狗熊,世界不再和平……

你不能把责任归咎于传送门设计师,其实是操作人员不会用。

JSON.stringify方法的真身其实是这样的:

JSON.stringify(value [, replacer] [, space])

传送的关键是第二个可选参数,replacer,官方的解释如下;

可选项,一个函数或数组,用来转换结果。
如果replacer是函数,JSON.stringify会回调该函数,并传入key和value参数,这两个参数指向JSON中的每一个成员。函数中的返回值用来取代原始值。如果返回undefined,那么该成员项被排除。根对象的key是一个空字符串。
如果replacer是数组,那么数组中的成员项就是JSON的key键,只有数组中出现的key才会被序列化。序列化的顺序会按照数组中key的顺序排列。如果JSON的中某项的值是数组时,该replacer会被忽略。

尼玛翻译的我蛋都碎了,还是看下案例吧。

首先拯救我们的英雄:

console.debug(JSON.stringify(oHero, function(key, value){
if (typeof value === 'function') {
return value + '';
}
return value;
}));
// 输出:{"name":"zjx","age":27,"getSkill":"function (type){ if(type == 'strength') console.debug('开山劈石掌'); }"}

英雄再次走出时空门,深吸了一口不是很新鲜的空气,感觉浑身是力,然后对着一块石头使出开山辟石掌……“咔嚓”,手掌骨折……

英雄用另一只手推倒传送门旁的操作员妹子,含泪质问“这是怎么回事??”

其实你也别怪妹子,她少按了几个按钮而已。

妹子回去问师太,师太教导:

JSON.parse(text [, reviver])

reviver官方解释,请勿菊紧:

可选项,一个用来转换结果的函数。该函数将迭代对象中的每一个成员。如果一个成员项包含嵌套对象,会先转换被嵌套的对象。对于每一个成员项,将发生如下事件:
如果reviver返回的是合法值,成员项的值会被替换为该值。
如果reviver返回的值等同于接收的值,成员项的值不会被修改。
如果reviver返回null或undefined,成员项会被删除。

第三次,妹子对英雄说:这次萌大奶!

var oNowHero = JSON.parse(strHero,function(key,value){
if(value.indexOf && value.indexOf('function')>-1){
return eval("(function(){return "+ value +" })()")
}
return value;
});
oNowHero.getSkill('strength');
// 输出:开山辟石掌

英雄很满意的用双手推倒了妹子…………

后记:

JSON.stringify中的replacer还可以是一个数组。

英雄是很忙碌的,他不仅要拯救我们地球,还要拯救艾泽拉斯大陆,拯救外域,拯救崔斯特姆……不同的世界需要不同的装备,如果把所有装备带在身上那太痛苦了,不仅自己负担大,而且传输过程中还有可能阻塞,结果就是脑袋出来了,屁股还在通道里,那么我们可以做筛选:

var oHero = {
zjx: 'zjx',
age: 27,
earth: '机关枪',
Azeroth: '阿什坎迪兄弟会之剑',
NewTristram: '不朽之王的碎岩者'
};
var strHero = JSON.stringify(oHero, ['zjx','age','Azeroth']);
console.debug(strHero);
// 输出:{"zjx":"zjx","age":27,"Azeroth":"阿什坎迪兄弟会之剑"}

于是去艾泽拉斯的时候只带上AL即可。

JSON.stringify第三个可选参数用于格式化输出,没啥意思,不解释。

本文链接


    

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 通过WordPress HTTP API 获取json内容并解析

    通过WordPress HTTP API 获取json内容并解析

    2017-04-01 10:17

  • 浏览器中查看 网页更新时间的方法

    浏览器中查看 网页更新时间的方法

    2017-03-24 16:00

  • 利用百度地图api通过城市地址等信息取经纬度

    利用百度地图api通过城市地址等信息取经纬度

    2017-02-11 08:01

  • highcharts图表实战篇:通过Ajax异步后台获取json数据中包含多

    highcharts图表实战篇:通过Ajax异步后台获取json数据中包含多

    2017-02-10 17:00

网友点评