【php】jquery中$.get实现解析json格式数据及jsonp跨域

时间:2022-12-18 09:37:40

一直以来都是写ajax都是使用$.getjson这个方法,主要图的就是跨域方便,当然跨域有时候也会带来不安全的隐患,现在项目中是$get,例子中基本上返回的是string格式,自己写getjson写习惯,想返回json格式的。下面就介绍三种实现json格式返回的方法。

  • json和eval方式实现

js代码:

1 $.get("index.php?a=manage/kcinfo&act=show", {spbs: spbs},
2  function(data) {
3      var
d = eval(
"("
+ data +
")");
4      var
html =
'';
5      if
(d.flag == 100) {
6          for
(i = 0, ln = d.data.length; i < ln; i++) {
7              html += '<tr><td>'+d.data[i].XDATE+'</td><td>'+d.data[i].SPBS+'</td><td>'+d.data[i].SALENUM+'</td><td>'+d.data[i].FREQNUM+'</td></tr>';
8          }
9          $('#showinfo').nextAll('tr').remove();
10          $('#showinfo').after(html);
11      }else
{
12          alert("修改失败!");
13      }
14      return
false
;
15  })
PHP代码:
1 $res['flag']='100';
2 $res['data']=$data;
3 exit(json_encode($res));

相关技巧

  1. get方式里面并没有指定返回内容的格式。这里使用var d = eval(“(” + data + “)”); 把对象转换为json对象。

对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次。这种方式也适合以普通javascipt方式获取json对象,以下举例说明:

var dataObj=eval(“(“+data+”)”);//转换为json对象

为什么要 eval这里要添加 “(“(“+data+”)”);//”呢?

原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行

 

2.for循环可以这样写for (i = 0, ln = d.data.length; i < ln; i++) ,大家第一看肯定会说关于循环优化的原则就是不要把计算写在循环体内,这样会造成多层运算,效率低下。但是大家注意:i = 0, ln = d.data.length这部分都是在分号前,属于初始化值,也就是在循环里只运算一次,语法(不仅js可以这些,php中的for也可以这样写):

for (变量=开始值;变量<=结束值;变量=变量+步进值){    需执行的代码}
    • get指定json格式返回

    js代码:

    1 $.get("index.php?a=manage/kcinfo&act=show", {spbs: spbs},
    2    function(d) {
    3        //var d = eval("(" + data + ")");
    4        var
    html =
    '';
    5        if
    (d.flag == 100) {
    6            for
    (i = 0, ln = d.data.length; i < ln; i++) {
    7                html += '<tr><td>'+d.data[i].XDATE+'</td><td>'+d.data[i].SPBS+'</td><td>'+d.data[i].SALENUM+'</td><td>'+d.data[i].FREQNUM+'</td></tr>';
    8            }
    9            $('#showinfo').nextAll('tr').remove();
    10            $('#showinfo').after(html);
    11        }else
    {
    12            alert("修改失败!");
    13        }
    14        return
    false
    ;
    15    },"json")

    PHP代码和上一种一样。

    相关知识点:

    • 这是"json"(一定要带双引号)不是json,我一直写json(不带双引号),导致返回一直失败,下次大家注意啦

    get指定jsonp实现跨域

    js代码:

    1 $.get("index.php?a=manage/kcinfo&act=show", {spbs: spbs},
    2    function(d) {
    3        //var d = eval("(" + data + ")");
    4        var
    html =
    '';
    5        if
    (d.flag == 100) {
    6            for
    (i = 0, ln = d.data.length; i < ln; i++) {
    7                html += '<tr><td>'+d.data[i].XDATE+'</td><td>'+d.data[i].SPBS+'</td><td>'+d.data[i].SALENUM+'</td><td>'+d.data[i].FREQNUM+'</td></tr>';
    8            }
    9            $('#showinfo').nextAll('tr').remove();
    10            $('#showinfo').after(html);
    11        }else
    {
    12            alert("修改失败!");
    13        }
    14        return
    false
    ;
    15    },"jsonp")

    PHP代码:

    1 exit($_GET['callback'].'('.json_encode($res).')');

    相关知识

    • 注意jsonp格式的url请求会多出:callback参数和_的请求参数

    【php】jquery中$.get实现解析json格式数据及jsonp跨域

    如果使用getjson就会立即想到这个是跨域必备的回调参数callback

    只需要exit($_GET['callback'].’(‘.json_encode($res).’)');这种格式返回就可以实现json跨域。

    引申知识:

    JSON和JSONP的区别:

    AJAX:最被推崇或者说首选的方案还是用JSON来传数据,靠JSONP来跨域

    JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。看到没?一个是描述信息的格式,一个是信息传递双方约定的方法。