• JSON(及其在ajax前后端交互的过程)小识


    一. json介绍


    json是一种轻量级的数据交换格式,规则很简单:

    1. 并列的数据之间用逗号(,)分隔;
    2. 映射用冒号(:)表示;
    3. 并列数据的集合(数组)用方括号([])表示;
    4. 映射的集合(对象)用大括号({})表示。
      对上述规则解析,可以发现:
    • 数组是用([])创建的,对象是用({})创建的;
    • 数组和对象里面的元素都是用(,)隔开:{name:"李华",age:"18",home:"shanghai"}&&[]
    • 对象和数组可以相互嵌套,一个数组中的一个元素可以是对象或数组,一个对象中的一个属性的值也可以是一个对象或数组;
    • 对象内部,属性的名称和值用(:)隔开,不能单独存在属性名或者值。
      ```
      对象:
      {name:"lihua",age:"18",home:"shanghai"}

      数组:
      [{"name":"李华","age":"18","home":"上海"},{"name":"小明","age":"21","home":"北京"},{"name":"阿飞","age":"25","home":"深圳"}]
      ```
      数组和对象都是数据的集合,除了使用符号不同,最重要的差异是:数组内的数据是有序的,而对象内的数据是无序的。

    二.json在前后端数据交互中的应用

    1. 服务端数据处理

    1.1 json_encode

    后台将数据处理成json格式,前端通过ajax调用进行DOM操作。在php中,数组分为三类:索引数组;关联数组;多维数组。而在javascript中,只有索引数组。
    所以,php中 json_encode()只将索引数组转成json数组格式,而将关联数组/多维数组转成json对象格式。

    1. $arr = array(111,'aaa','bbb');
    2. $arr1 = array(
    3. 'a' => 'aaa',
    4. 'b' => 222
    5. );
    6. $arr2 = array(
    7. 'a' => 'aaa',
    8. 'other' => array(
    9. 'bbb',1111
    10. )
    11. );
    12. echo json_encode($arr); //[111,"aaa","bbb"]
    13. echo json_encode($arr1); //{"a":"aaa","b":222}
    14. echo json_encode($arr2); //{"a":"aaa","other":["bbb",1111]}

    1.2 json_decode

    php对json格式的字符串进行解码,将其转为php常量。

    下例来自php官网:

    1. $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
    2. var_dump(json_decode($json)); //返回一个对象
    3. var_dump(json_decode($json, true)); //返回一个数组
    4. ?>
    1. object(stdClass)#1 (5) {
    2. ["a"] => int(1)
    3. ["b"] => int(2)
    4. ["c"] => int(3)
    5. ["d"] => int(4)
    6. ["e"] => int(5)
    7. }
    8. array(5) {
    9. ["a"] => int(1)
    10. ["b"] => int(2)
    11. ["c"] => int(3)
    12. ["d"] => int(4)
    13. ["e"] => int(5)
    14. }

    2.前端对json的处理

    前端通过ajax请求回数据后,如果使用jquery中的$.ajax,则只需要声明返回的数据类型dataType:'json';

    如果用原生javascript解析json,则有三种方法:

    • eval()
    • new Function()
    • JSON.parse()

    这里就不赘述了,有需要的可以自行去查阅。

    2.1 遍历复杂json

    有时候需要对json进行循环遍历,比如画echart图的时候,如果用json中元素的某个属性值作为x轴数据,用另外一个属性值作为映射值。

     [{"name":"李华","age":"18","home":"上海"},{"name":"小明","age":"21","home":"北京"},{"name":"阿飞","age":"25","home":"深圳"}]

    以上述json作为例子,要用name作为x轴,age作为对应值。就需要对json遍历两次,将所有的name属性值push为一个数组,同样,将所有的age属性值push为一个数组,再赋值给相对应的坐标。

    1. success : function(result)
    2. data : (function(){
    3. var arr=[];
    4. $.ajax({
    5. type : "post",
    6. async : false, //同步执行
    7. url : "test1.php",
    8. data : {},
    9. dataType : "json", //返回数据形式为json
    10. success : function(result) {
    11. if (result) {
    12. console.log(result);
    13. for(var i=0;i<result.length;i++){
    14. console.log(result[i].name);
    15. arr.push(result[i].name);
    16. }
    17. }
    18. },
    19. error : function(errorMsg) {
    20. alert("图表请求数据失败啦!");
    21. myChart.hideLoading();
    22. }
    23. })
    24. return arr;
    25. })()
    26. //控制台打印出ajax解析之后的结果:[Object, Object, Object, Object, Object, Object, Object, Object]

    至此,重识JSON,前后端之相交脉络亦了然一二。更觉前端道阻且长,唯上下八方求索,方不落人后。

  • 相关阅读:
    动态内存分分配(malloc、free、calloc、realloc)
    Mysql 45讲学习笔记(二十三)MYSQL怎么保证数据不丢
    建立量化交易趋势跟踪策略的五个指标
    JAVA - 项目启动后执行定时任务
    其他变量定义、简单四则运算、数组
    springboot265基于Spring Boot的库存管理系统
    等精度频率计verilog,quartus仿真视频,原理图,代码
    川宁生物业绩持续高涨
    智能座舱架构与芯片- (4) 硬件篇 中
    springboot---任务---整合quartz与task----定时任务(详细)
  • 原文地址:https://blog.csdn.net/cqn2bd2b/article/details/127748373