首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Ajax >

jsonp的解析有关问题

2013-08-04 
jsonp的解析问题本帖最后由 Rico_ 于 2013-07-22 23:12:36 编辑项目中调用了新浪微博的api 返回的是jsonp

jsonp的解析问题
本帖最后由 Rico_ 于 2013-07-22 23:12:36 编辑 项目中调用了新浪微博的api 返回的是jsonp数据,解析时不会,各位大侠给小弟看下,谢啦
  
 一般我们获取到的服务器返回的的json都是类似于这种的。举个例子{"urls":[
{"result":true,"url_short":"http://t.cn/h5FGy","url_long":"http://www.cnblogs.com","type":0}
]} 一个完整的json数据。名值对一一对应,数组对象结构清晰


但是我现在获取到的却是这个。(我通过alert获取的)
jQuery18308495466143358499_1374500715357({"statuses":[{"created_at":"Mon Jul 22 21:31:40 +0800 2013","id":"3602976080238037","mid":"3602976080238037","idstr":"3602976080238037","text":"\u4f60\u4e0d\u662f\u6211\u7684\u795e\u5bf9\u624b@\u6012\u543c\u7684\u571f\u5305\u5b50 \u4f60\u662f\u6211\u7684\u5c0f\u4f19\u4f34\u548c\u732a\u961f\u53cb[\u9177] \u6211\u5728:http:\/\/t.cn\/zQZVsKR","source":"。。。后面省略


但是现在我期望获取到的是这种
{"statuses":[{"created_at":"Mon Jul 22 21:27:00 +0800 2013","id":"3602974909414937","mid":"3602974909414937","idstr":"3602974909414937","text":"\u4e0b\u6b21\u518d\u6765\u5e0c\u671b\u6709\u4f60@\u8c22\u6f47x-x \u6211\u5728\u8fd9\u91cc:http:\/\/t.cn\/zHecOsL","source":"。。。后面省略

也就是说前面多出了jQuery18308495466143358499_1374500715357
以至于 getdata.data[0]获取到的是j
为什么?然后我上网查了
显示如下:
$.ajax({ 
type : "get", 
async:false, 
url : "ajax.ashx", 
dataType : "jsonp", 
jsonp: "callbackparam",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback) 
jsonpCallback:"success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

确实,我的页面上引用了jquery1.8.3
但是现在问题是如何获取我期望获取的呢?(就是前面去掉jQuery18308495466143358499_1374500715357然后进行解析)但是肯定有一个最简单粗暴的办法是用js的字符串操作函数去掉,但是那边返回来的不都是固定的前缀也就是说这一段字数是不断再改的。所以请求一个正确的办法。或者各位大侠都是如何解析jsonp数据的呢?


在此,小弟问一下jQuery18308495466143358499_1374500715357为什么会出现,应该怎么解析他返回过来的呢?完整返回json见http://pan.baidu.com/share/link?shareid=2950801806&uk=2416608530




我的代码

 $(document).ready(function () {

            $.ajax({

                url: "https://api.****.json?***",
                type: "GET",
                dataType: "jsonp",
                cache: false,
                success: function (getdata) {
                    alert(getdata);


                    alert(getdata.data);

                    // var mes_obj = eval("(" + getdata.data + ")");

                    var str_statuses;
                    str_statuses = getdata.data[0];
                    alert(str_statuses);
                   

                }
            });
        });



依次弹出
[object object ]
[完整json(见链接)]
[j]


现在我的问题是如何正确解析jsonp?
好像还有回调函数callback什么的?那个是怎么用的?我现在是用jquery解析的。


最后我看了这篇文章,照他做了,结果也没做出像他的效果。

jsonp jQuery
[解决办法]
jQuery18308495466143358499_1374500715357 是jq自动生成的函数名
就是说你得到的是形如
func({"statuses":数据体})
这样的一个 js 语句,不知道为什么 jq 没有去执行他。可能是你哪儿写的不对
变通的做法是
dataType : "jsonp", 
jsonp: "callbackparam" //即指定一个回调函数名,这样 jq 就不会自动生成了
于是返回的数据就应该变成
callbackparam({"statuses":数据体})
在样的了
你再用 eval 去执行它一下就可得到 json 对象了
这件事情本该 jq 完成的,不知道他为什么没做
他不做,就只有自己做了

[解决办法]
本帖最后由 showbo 于 2013-07-24 14:12:26 编辑 指定回调函数就行了。。至于新浪为什么返回的data数据中还加上回调函数名称就不清楚了。没找到相关说明
 <script src='http://code.jquery.com/jquery-1.8.3.js'></script>
    <script type="text/javascript">
function Callback(o){
  if(o.data)eval(o.data);//在eval执行一次回调函数


  else{//o为实际返回的JSON对象了
    
      alert(o.statuses[0].created_at)
  }
}
    
         $(document).ready(function () {

             $.ajax({
                 url: "https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                 type: "GET",
                 dataType: "jsonp",jsonpCallback:'Callback',
                 cache: false
             });
         });
</script>

热点排行