jsonp的解析问题

时间:2022-05-26 09:15:12
项目中调用了新浪微博的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解析的。


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

19 个解决方案

#1


你返回的是一个json数组。用两个for循环就可以了
第一层循环数组
第二层循环json

#2


再不会瞧瞧这一贴: http://bbs.csdn.net/topics/390523734

#3



引用 1 楼 xiaofanku 的回复:
你返回的是一个json数组。用两个for循环就可以了
第一层循环数组
第二层循环json


我知道 ,可现在的问题是它返回的不是{对象},而是Query18308495466143358499_1374500715357然后再加{对象}

#4


引用 1 楼 xiaofanku 的回复:
你返回的是一个json数组。用两个for循环就可以了
第一层循环数组
第二层循环json


我知道该怎样处理json数据,each函数循环,但是想问的是为什么如上这种情况。

感觉返回的数据有问题。。。。。

#5


但新浪也不会这么坑爹呀

#6


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

#7


自己用firebug或者chrome监视下发出的jsonp请求到底返回了什么内容

alert(getdata);//输出[object object ],说明肯定不是jquery自动注册回调函数jQuery18308495466143358499_1374500715357这种的了,要不应该输出函数体

alert(getdata.data);//输出[完整json(见链接)],那么新浪返回的数据做为字符串,而没有转换为json对象


综合上面的内容,实际上getdata的结构应该为 {"data":"新浪返回实际json格式字符串"},楼主最好看清楚新浪api实际返回的json对象时什么,而不是猜测。。

要得到实际json对象,需要eval下getdata.data,就是被注释掉的那句代码

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

 alert(str_statuses.length);
 alert(str_statuses[0].created_at);

#8


引用 7 楼 showbo 的回复:
自己用firebug或者chrome监视下发出的jsonp请求到底返回了什么内容

alert(getdata);//输出[object object ],说明肯定不是jquery自动注册回调函数jQuery18308495466143358499_1374500715357这种的了,要不应该输出函数体

alert(getdata.data);//输出[完整json(见链接)],那么新浪返回的数据做为字符串,而没有转换为json对象


综合上面的内容,实际上getdata的结构应该为 {"data":"新浪返回实际json格式字符串"},楼主最好看清楚新浪api实际返回的json对象时什么,而不是猜测。。

要得到实际json对象,需要eval下getdata.data,就是被注释掉的那句代码

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

 alert(str_statuses.length);
 alert(str_statuses[0].created_at);


我用firebug看了一下
jsonp的解析问题

 贴一部分
try{jQuery18304344409110965938_1374584955164({"code":1,"data":"jQuery18304344409110965938_1374584955164({\"statuses\":[{\"created_at\":\"Tue Jul 23 21:04:42 +0800 2013\",\"id\":\"3603331681713848\",\"mid\":\"3603331681713848\",\"idstr\":\"3603331681713848\",\"text\":\"\\u6765\\u5230\\u79d1\\u6280\\u4e0e\\u4eba\\u6587\\u7684\\u5341\\u5b57\\u8def\\u53e3 \\u6211\\u5728:http:\\\/\\\/t.cn\\\/zQqlMfG\",\"source\":\"<a href=\\\"http:\\\/\\\/app.weibo.com\\\/t\\\/feed\\\/3Q8yH0\\\" rel=\\\"nofollow\\\">\\u534e\\u4e3aAscend P6<\\\/a>\",\"favorited\":false,\"truncated\":false,\"in_reply_to_status_id\":\"\",\"in_reply_to_user_id


这种情况该怎么办呢?
还有,如果我在url中最后加入'&callback=chuli'
就会返回
try{chuli({"code":1,"data":"jQuery18304344409110965938_1374584955164({\"statuses\":[{\"created_at\":\"Tue Jul 23 21:04:42 +0800 2013\",\"id\":\"3603331681713848\",\"mid\":\"3603331681713848\",\"idstr\":\"3603331681713848\",\"text\":\"\\u6765\\u5230\\u79d1\\u6280\\u4e0e\\u4eba\\u6587\\u7684\\u5341\\u5b57\\u8def\\u53e3 \\u6211\\u5728:http:\\\/\\\/t.cn\\\/zQqlMfG\",\"source\":\"<a href=\\\"http:\\\/\\\/app.weibo.com\\\/t\\\/feed\\\/3Q8yH0\\\" rel=\\\"nofollow\\\">\\u534e\\u4e3aAscend P6<\\\/a>\",\"favorited\":false,\"truncated\":false,\"in_reply_to_status_id\":\"\",\"in_reply_to_user_id


这样应该怎么写代码呢?

我尝试着eval()
然后再在页面注册一个chuli函数,这样也不行,
求教

#9


汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>



#10


jsonp的解析问题

#11


jsonp的解析问题

#12


引用 9 楼 showbo 的回复:
汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>


我也试了下你写的,可以正常读取,但是现在我要调用的这个接口就是不行
  https://api.weibo.com/2/place/friends_timeline.json


文档见  http://open.weibo.com/wiki/2/place/friends_timeline 
我也没见需要什么特别的参数

难道这个接口有问题?

#13


接上楼,  把接口写完整 https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC

access_token用了你给的例子上的

#14


引用 9 楼 showbo 的回复:
汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>





 <script src='http://code.jquery.com/jquery-1.8.3.js'></script>
    <script type="text/javascript">

    
         $(document).ready(function () {

             $.ajax({
                 url: "https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                
                 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);


                 }
             });
         });
</script>

这个不行,求教

#15


引用 9 楼 showbo 的回复:
汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>

【我是马甲】
注意到了一个细节,https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC返回的json数据是 jsonp的解析问题
data:后面是个json对象

但是https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC返回的json数据中data:后面有引号,是字符串

是不是因为新浪返回的本来就是个字符串,然后第一种成功的例子中jq把这个字符串转成了对象,所以我们可以用
而第二种情况中 ,jq由于某种原因没有把新浪返回的字符串转换成对象,也就是说转换失败了,并且没有把其自动生成的函数名删除,然后就返回了
try{jQuery18307654429280502587_1374645220059({"code":1,"data":"jQuery18307654429280502587_1374645220059({\"statuses\":[{\"created_at\":\


或者是其他的原因?我认为接口有问题的可能性不大,那到底是什么原因呢?
求教!!!

#16


本帖最后由 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>

#17


引用 16 楼 showbo 的回复:
指定回调函数就行了。。至于新浪为什么返回的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>


用你的方法可以了,谢谢!
就是有点牺牲,替代jq自动生成的函数会阻止jq在触发正常事件时调用succes和complete回调
不过已经很满意了, It'works!

#18


引用 17 楼 Rico_ 的回复:
Quote: 引用 16 楼 showbo 的回复:

指定回调函数就行了。。至于新浪为什么返回的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>


用你的方法可以了,谢谢!
就是有点牺牲,替代jq自动生成的函数会阻止jq在触发正常事件时调用succes和complete回调
不过已经很满意了, It'works!


可以添加success回调的。。我没有加上而已。。

 <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,
                 success:function(d){alert('请求成功!')}
             });
         });
</script>

#19


引用 18 楼 showbo 的回复:
Quote: 引用 17 楼 Rico_ 的回复:

Quote: 引用 16 楼 showbo 的回复:

指定回调函数就行了。。至于新浪为什么返回的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>


用你的方法可以了,谢谢!
就是有点牺牲,替代jq自动生成的函数会阻止jq在触发正常事件时调用succes和complete回调
不过已经很满意了, It'works!


可以添加success回调的。。我没有加上而已。。

 <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,
                 success:function(d){alert('请求成功!')}
             });
         });
</script>

嗯,谢谢你的帮助,问题解决了,一直没回复。

#1


你返回的是一个json数组。用两个for循环就可以了
第一层循环数组
第二层循环json

#2


再不会瞧瞧这一贴: http://bbs.csdn.net/topics/390523734

#3



引用 1 楼 xiaofanku 的回复:
你返回的是一个json数组。用两个for循环就可以了
第一层循环数组
第二层循环json


我知道 ,可现在的问题是它返回的不是{对象},而是Query18308495466143358499_1374500715357然后再加{对象}

#4


引用 1 楼 xiaofanku 的回复:
你返回的是一个json数组。用两个for循环就可以了
第一层循环数组
第二层循环json


我知道该怎样处理json数据,each函数循环,但是想问的是为什么如上这种情况。

感觉返回的数据有问题。。。。。

#5


但新浪也不会这么坑爹呀

#6


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

#7


自己用firebug或者chrome监视下发出的jsonp请求到底返回了什么内容

alert(getdata);//输出[object object ],说明肯定不是jquery自动注册回调函数jQuery18308495466143358499_1374500715357这种的了,要不应该输出函数体

alert(getdata.data);//输出[完整json(见链接)],那么新浪返回的数据做为字符串,而没有转换为json对象


综合上面的内容,实际上getdata的结构应该为 {"data":"新浪返回实际json格式字符串"},楼主最好看清楚新浪api实际返回的json对象时什么,而不是猜测。。

要得到实际json对象,需要eval下getdata.data,就是被注释掉的那句代码

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

 alert(str_statuses.length);
 alert(str_statuses[0].created_at);

#8


引用 7 楼 showbo 的回复:
自己用firebug或者chrome监视下发出的jsonp请求到底返回了什么内容

alert(getdata);//输出[object object ],说明肯定不是jquery自动注册回调函数jQuery18308495466143358499_1374500715357这种的了,要不应该输出函数体

alert(getdata.data);//输出[完整json(见链接)],那么新浪返回的数据做为字符串,而没有转换为json对象


综合上面的内容,实际上getdata的结构应该为 {"data":"新浪返回实际json格式字符串"},楼主最好看清楚新浪api实际返回的json对象时什么,而不是猜测。。

要得到实际json对象,需要eval下getdata.data,就是被注释掉的那句代码

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

 alert(str_statuses.length);
 alert(str_statuses[0].created_at);


我用firebug看了一下
jsonp的解析问题

 贴一部分
try{jQuery18304344409110965938_1374584955164({"code":1,"data":"jQuery18304344409110965938_1374584955164({\"statuses\":[{\"created_at\":\"Tue Jul 23 21:04:42 +0800 2013\",\"id\":\"3603331681713848\",\"mid\":\"3603331681713848\",\"idstr\":\"3603331681713848\",\"text\":\"\\u6765\\u5230\\u79d1\\u6280\\u4e0e\\u4eba\\u6587\\u7684\\u5341\\u5b57\\u8def\\u53e3 \\u6211\\u5728:http:\\\/\\\/t.cn\\\/zQqlMfG\",\"source\":\"<a href=\\\"http:\\\/\\\/app.weibo.com\\\/t\\\/feed\\\/3Q8yH0\\\" rel=\\\"nofollow\\\">\\u534e\\u4e3aAscend P6<\\\/a>\",\"favorited\":false,\"truncated\":false,\"in_reply_to_status_id\":\"\",\"in_reply_to_user_id


这种情况该怎么办呢?
还有,如果我在url中最后加入'&callback=chuli'
就会返回
try{chuli({"code":1,"data":"jQuery18304344409110965938_1374584955164({\"statuses\":[{\"created_at\":\"Tue Jul 23 21:04:42 +0800 2013\",\"id\":\"3603331681713848\",\"mid\":\"3603331681713848\",\"idstr\":\"3603331681713848\",\"text\":\"\\u6765\\u5230\\u79d1\\u6280\\u4e0e\\u4eba\\u6587\\u7684\\u5341\\u5b57\\u8def\\u53e3 \\u6211\\u5728:http:\\\/\\\/t.cn\\\/zQqlMfG\",\"source\":\"<a href=\\\"http:\\\/\\\/app.weibo.com\\\/t\\\/feed\\\/3Q8yH0\\\" rel=\\\"nofollow\\\">\\u534e\\u4e3aAscend P6<\\\/a>\",\"favorited\":false,\"truncated\":false,\"in_reply_to_status_id\":\"\",\"in_reply_to_user_id


这样应该怎么写代码呢?

我尝试着eval()
然后再在页面注册一个chuli函数,这样也不行,
求教

#9


汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>



#10


jsonp的解析问题

#11


jsonp的解析问题

#12


引用 9 楼 showbo 的回复:
汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>


我也试了下你写的,可以正常读取,但是现在我要调用的这个接口就是不行
  https://api.weibo.com/2/place/friends_timeline.json


文档见  http://open.weibo.com/wiki/2/place/friends_timeline 
我也没见需要什么特别的参数

难道这个接口有问题?

#13


接上楼,  把接口写完整 https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC

access_token用了你给的例子上的

#14


引用 9 楼 showbo 的回复:
汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>





 <script src='http://code.jquery.com/jquery-1.8.3.js'></script>
    <script type="text/javascript">

    
         $(document).ready(function () {

             $.ajax({
                 url: "https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                
                 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);


                 }
             });
         });
</script>

这个不行,求教

#15


引用 9 楼 showbo 的回复:
汗。。怎么api连函数名称也一起返回了。。

楼主看下新浪的jsonp都需要些什么参数,如哪个键是回调函数的,需要同时传递哪些参数才会得到
回调函数(实际的json数据)
这种代码

jquery自动注册的jQuery18304344409110965938_1374584955164这个函数执行完毕后就删除了,所以eval  data属性会找不到这个函数

刚才测试了下https://api.weibo.com/2/statuses/friends_timeline.json这个API,视乎没错误啊,生成的就是正确的JSONP格式的回调。。
jsonp的解析问题
<script src='http://code.jquery.com/jquery-1.8.3.js'></script>
     <script>
$(document).ready(function () {
 
            $.ajax({
 
                url: "https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC",
                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);
                    
 
                }
            });
        });
      </script>

【我是马甲】
注意到了一个细节,https://api.weibo.com/2/statuses/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC返回的json数据是 jsonp的解析问题
data:后面是个json对象

但是https://api.weibo.com/2/place/friends_timeline.json?access_token=2.005CNGeCEuhfGDcf342933f4QekjbC返回的json数据中data:后面有引号,是字符串

是不是因为新浪返回的本来就是个字符串,然后第一种成功的例子中jq把这个字符串转成了对象,所以我们可以用
而第二种情况中 ,jq由于某种原因没有把新浪返回的字符串转换成对象,也就是说转换失败了,并且没有把其自动生成的函数名删除,然后就返回了
try{jQuery18307654429280502587_1374645220059({"code":1,"data":"jQuery18307654429280502587_1374645220059({\"statuses\":[{\"created_at\":\


或者是其他的原因?我认为接口有问题的可能性不大,那到底是什么原因呢?
求教!!!

#16


本帖最后由 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>

#17


引用 16 楼 showbo 的回复:
指定回调函数就行了。。至于新浪为什么返回的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>


用你的方法可以了,谢谢!
就是有点牺牲,替代jq自动生成的函数会阻止jq在触发正常事件时调用succes和complete回调
不过已经很满意了, It'works!

#18


引用 17 楼 Rico_ 的回复:
Quote: 引用 16 楼 showbo 的回复:

指定回调函数就行了。。至于新浪为什么返回的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>


用你的方法可以了,谢谢!
就是有点牺牲,替代jq自动生成的函数会阻止jq在触发正常事件时调用succes和complete回调
不过已经很满意了, It'works!


可以添加success回调的。。我没有加上而已。。

 <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,
                 success:function(d){alert('请求成功!')}
             });
         });
</script>

#19


引用 18 楼 showbo 的回复:
Quote: 引用 17 楼 Rico_ 的回复:

Quote: 引用 16 楼 showbo 的回复:

指定回调函数就行了。。至于新浪为什么返回的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>


用你的方法可以了,谢谢!
就是有点牺牲,替代jq自动生成的函数会阻止jq在触发正常事件时调用succes和complete回调
不过已经很满意了, It'works!


可以添加success回调的。。我没有加上而已。。

 <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,
                 success:function(d){alert('请求成功!')}
             });
         });
</script>

嗯,谢谢你的帮助,问题解决了,一直没回复。

#20