下面给大家介绍关于JSONP的数据格式优化的一些小技巧,希望对大家有点帮助。
在用JSON传递数据时有一个问题,就是在传递列表时,字段名过于重复,浪费了带宽,降低了效率。比如:
代码如下 复制代码
{
data:[
{name:”张三”,idcard:””…},
{name:”李四”,idcard:””…}
]
}
数据有多少条,”name”和”idcard”这两个字符串就有多少套,那么是否可以简化一下?
在JSONP模式中只需要给一个方法传入数据,而这个数据不一定是直接的数据变量,在javascript里可以通过自调用匿名函数返回数据,所以可以把这个匿名函数当成入参传给这个方法:
代码如下 复制代码
SomeFunction( (function(){return data;})() );
对于客户端网页来说,只要传入的数据格式正确就可以,至于是数据还是函数返回值并不关注,但是对于服务器端,如果返回函数,就可以做很多事情,而且这些事情客户端是无法拒绝的(因为跨域),其中包括刚才讨论到的数据key冗余问题。
key冗余问题,最容易想到的就是将key抽取出来,在函数自执行的时候再拼回去,所以可以定义两个变量用于存key值和数据,再通过for循环拼装,代码如下:
代码如下 复制代码
(function(){
var m=[“name”,”idcard”];//用于存key名
var d=[[“张三”,””],[“李四”,””]];//完全用于储存数据,没有key,没有浪费
var r={list:[]};//用于返回结果
for(var i=0;i<d.length;i++){
r.list.push({});
for(var j=0;j<m.length;j++){
r.list[i][m[j]]=d[i][j];
}
};//将数据拼装回去
try{return r;}finally{}//返回客户端要的数据
})();//自执行
如果字段名都很短而且数据条数少的话,就不需要这么麻烦,直接返回数据就可以,当数据量较多,这种方式就比较实用了。
另外,在finally里面可以放额外的代码,比如:
finally{alert(“虽然您访问的是163,但是数据是从baidu来的哦!”)}
显然163对此无能为力:)至于这里面放什么东西就取决于业务需要了。这种格式暂且称之为JSONPM吧(JSONP Metadata extraction)。