zoukankan      html  css  js  c++  java
  • 认识JSON

      JSON(Javascript Object Notation javascript对象表示法),是web前端重要的一种数据格式,它是javascript一个严格的子集但又独立于javascript,很多语言都有解析和序列化JSON的API。说到JSON不得不提到XML,如今在互联网上传输的数据主要还是以XML为主,因其格式统一,容易扩展被广泛接受,但它的数据冗余和解析复杂是个硬伤。而JSON在传输小块数据时体现了它的优势,数据精简,解析简单(当做JS对象来访问)。有关JSON和XML之间的比较可参考:http://www.cnblogs.com/SanMaoSpace/p/3139186.html#top

    一:语法

      既然是javascript语言的严格子集,只要记住它相对于javascript的特殊点就好了。

      1:不支持undefined

      2:字符串必须要用双引号

      3:JSON对象字面量中的属性必须要用双引号引起来<javascript中引不引都是OK的>

      4:没有变量的概念,末尾没有分号

    //javascript
    var person = {
        name: "alex",
        age: 36
    };
    
    //JSON
    {
        "name":"alex",
        "age":36
    }
    
    //XML
    <person>
      <name>alex</name>
      <age>36</age>
    </person>

    二:JSON的解析和序列化

      JSON的一大优势就是解析简单,可以直接将JSON数据解析为javascript对象,用对象的方式来访问JSON数据,相对于XML将数据解析为DOM文档,再使用DOM的方式来访问XML数据来说简化了很多。比如上面的例子要找age属性的值,JSON:obj.age   XML:document.getElementsByTagName("age")[0].nodeValue 差异立显。

      2.1 解析(JSON字符串解析为原生JavaScript)JSON.parse(jsonStr,[reviver])

      一般JSON数据是作为配置文件XX.json存在服务器端,所以前端一般是ajax请求服务器获取XX.json文件,因为原生ajax的返回数据类型只有responseXML和responseText两种,所有要获取json文件还得使用Jquery的$.getJSON or $.ajax方法,而Jquery ajax请求json文件的返回结果就是[object Object],可以直接使用JS的方法获取JSON的节点值了,综合上述,将JSON字符串解析为原生JavaScript对象的应用场景并不多。

      2.2 序列化(JavaScript对象序列化为JSON字符串)JSON.stringify(jsObj,[replacer],[space])

      序列化一般是要将得到的JSON字符串放到网络中进行传输了.

    var person = {
        name:"alex",
        age:55,
        address:undefined,
        job:"software engineer",
        friends:{
            "friend1":"lee",
            "friend2":"lytton",
        }
    };
    
    Object.defineProperty(person,"job",{
        enumerable:false
    });
    
    var json_strig = JSON.stringify(person);
    alert(json_strig);

     

     从序列化结果可以看出以下几点:

      1:值为undefined的属性被忽略

          2:属性如果是不可枚举的也被忽略

          3:JS的属性都添加了引号<JSON的格式规定>

       2.3 序列化选项

      JSON.stringify()还可接受另两个可选参数,依次是过滤器(一个数组 or 函数)和缩进设置

    数组:数组成员表示要序列化的属性名字

    var person = {
        name:"alex",
        age:55,
        address:undefined,
        job:"software engineer",
        friends:{
            "friend1":"lee",
            "friend2":"lytton",
        }
    };
    
    var json_strig = JSON.stringify(person,["name","age"]);
    alert(json_strig);

     

    函数:function(k,v),对每个要序列化的属性执行此函数返回此属性的value值

    var person = {
        name:"alex",
        age:55,
        address:undefined,
        job:"software engineer",
        friends:{
            "friend1":"lee",
            "friend2":"lytton",
        }
    };
    
    var json_strig = JSON.stringify(person,function(key,value){
        switch(key){
            case "name":
                return "stone";
            default:
                return value;
        }
        
    });
    alert(json_strig);

     

    使用缩进

    var person = {
        name:"alex",
        age:55,
        address:undefined,
        job:"software engineer",
        friends:{
            "friend1":"lee",
            "friend2":"lytton",
        }
    };
    
    var json_strig = JSON.stringify(person,function(key,value){
        switch(key){
            case "name":
                return "stone";
            default:
                return value;
        }
        
    },20);
    alert(json_strig);

     

    缩进只是为了让人更方便阅读json,对机器而言不重要,缩进最大值是10,大于10被当做10处理。

      2.4 toJSON()函数

      这个函数是对JSON.stringify的补充,如果JS对象中包含了这个函数的实现,JOSN.stringify()将优先按照这个方法对JS对象进行转换。

    var person = {
        name:"alex",
        age:55,
        address:undefined,
        job:"software engineer",
        friends:{
            "friend1":"lee",
            "friend2":"lytton",
        },
        toJSON:function(){
            return this.name;
        }
    };
    
    var json_strig = JSON.stringify(person,function(key,value){
        switch(key){
            case "name":
                return "stone";
            default:
                return value;
        }
        
    },20);
    
    alert(json_strig);

     

    因为JS对象有toJSON()方法了,所以对它的需序列化toJSON方法的优先级最高,最终序列化的结果就是this.name(alex)。下面是序列化的优先级顺序

      

       

  • 相关阅读:
    主线程和子线程的区别
    正则表达式 之 常用实例
    Asp.Net 之 未能加载文件或程序集 system.web.extensions 解决方法
    .Net 与 Java 的服务接口相互调用
    C# 之 SqlConnection 类
    ADO.Net 之 数据库连接池(一)
    C# 之 DataReader 和 DataSet 的区别
    Asp.Net 之 缓存机制
    IIS 之 失败请求跟踪规则
    IIS 之 HTTP错误信息提示
  • 原文地址:https://www.cnblogs.com/Flychown/p/6308739.html
Copyright © 2011-2022 走看看