• JSON


    JavaScript之JSON

    一.什么是JSON?

       JSON的英文全程是JavaScript Object Notation(即JavaScript对象表示法),它是一种数据交换格式。是由Douglas Crockfordba把它作为IETF RFC4627提交给IETF的。我们最初需要知道的是:

    • JSON是一种数据格式,而不是一种编程语言
    • JSON并不从属于JavaScript,因为不仅JavaScript可以试用JSON,其他许多编程语言都可以使用JSON。

    二.JSON的基本语法。

      JSON包括简单值、对象值以及数组。

      1.简单值:与JavaScript相同,JSON支持字符串、数组、布尔值和null,但它不支持undefined。 比如说 8 ,这个数组便是一个最简单的JSON数据格式;“Hello Wrld”,这个字符串同样也是一个简单的JSON数据格式。但是JSON和JavaScript有一个很大的区别在于:JSON使用字符串时必须使用双引号,如果使用单引号会导致语法错误。

       2.对象:它是JSON中的一中复杂数据类型。JSON中的对象和JavaScript的对象字面量是十分相似的。

         首先,我们给出一个JavaScript中的对象字面量:

    var Person={
            name:"Mr Zhu",
            age:21
    };
    

      接着我们给出一个用JSON表示的对象:

    {
        "name":"Mr Zhu",
        "age":21
    }
    

    通过比较,我们可以看出,两者的主要区别

    • 首先,JSON中没有声明变量。(因为JSON是不支持变量的,除此之外,JSON同样不支持函数和对象实例);
    • 其次,JSON的对象末尾没有分号(因为我刚刚说过,JSON不是从属于JavaScript的)
    • 最后,JSON要求属性名一定要有双引号括起来

      3.数组:它是JSON中的另外一种复杂的数据类型。它采用的语法就是使用JavaScript中的数组字面量形式。

             比如:在JavaScript中,我们可以这样表示一个数组:

           var value=["Mr Zhu",20,true];
    

         而JSON是这样表达数据的:

        ["Mr Zhu",20,true]
    

     通过比较,我们可以得出JSON与JavaScript两者关于数组的主要区别

    • JavaScript表示数组不仅可以用字面量方法,还可以使用构造函数的方法;而JSON只能使用字面量方法。
    • JSON中不支持变量,且不应该在语句结束之后使用分号。

    三.将JavaScript对象序列化为JSON字符串。

      序列化过程需要使用JSON对象的stringify()方法。该方法接受三个参数,分别是将要序列化的对象的引用、过滤器(数组或函数)以及一个决定是否在JSON字符字符串中保留缩进的选项

      1.首先,我来谈谈第一个参数。先给出以下JavaScript对象字面量代码:

        

    var person={
        name:"Mr Zhu",
        age:21,
        year:2016
    };
    

    接下来我们就可以使用JSON.stringify()方法来序列化这个对象:

    var jsonText=JSON.stringify(person);
    

     这句代码接受了第一个参数(这个参数时必选的,没有其他两个,说明其他两个不是必选的),即将JavaScript对象转化为了JSON字面量保存在了jsonText变量中。默认情况下,JSON.stringify()输出的JSON字符串不包含任何空格字符或缩进,因此实际上保存在jsonText变量中的字符串如下:

    {“name”:"Mr Zhu","age":21,“year”:2016}
    

      2.过滤器参数。文章的开头提到,过滤器参数可以是数组也可以是函数。

        首先,让我们先学习过滤器参数时数组的情况。观察以下代码:

    var person={
        name:"Mr Zhu",
        age:21,
        year:2016
    };
    var jsonText=JSON.stringify(person,["name","age"]);

     这时,保存在jsonText变量中的JSON字符串为:

    {"name":"Mr Zhu","age":21}
    

     也就是说,在过滤器数组参数中的属性名所对应的属性被过滤后剩了下来,而year属性则被过滤掉了,这便是我们称之为过滤器的原因。

        接着,让我们学习第二个参数为函数(这个函数被称为替换函数)的情况。观察以下代码:

    var person={
        name:"Mr Zhu",
        age:21,
        year:2016
    };
    var jsonText=JSON.springify(person,function(key,value){
             switch(key){
                        case "age":
                              return  18;
                        case "year":
                              return undefined;
                        default:
                              return value;
    }
    });                                                            
    

    这是,保存在jsonText变量中的JSON字符串成了:

    {"name":"Mr Zhu","age":18}
    

     注意:函数过滤器根据传入的键来决定结果。且要序列化的对象中的每一个对象都要经过过滤器(所以switch语句中没有break)。比如这个例子,我们需要对JavaScript对象序列化为JSON字符串,由于第二个参数是函数,那么其中的每一个属性都会经过这个过滤器,传入键名,return函数中设置的value以改变默认的JSON字符串,如第一个传入键名“name”(我们可以理解为属性名),函数中没有对其有特定要求,这时,就是default了,返回value(即不作出任何改变);第二个传入“age”,函数中要求返回18,这时输出的字符串就会被修改为18了;接下来传入“year”,根据函数应当返回undefined,但是我之前说过,JSON是不支持undefined这个类型的,于是,序列化的JSON字符串会将year这个属性删除。

      3.字符串缩进参数。

      首先,先观察以下代码:

    var person={
        name:"Mr Zhu",
        age:21,
        year:2016
    };
    var jsonText=JSON.springify(person,null,4);
    

     首先注意到,springify()方法的第二次过滤器参数为null,这表示我们不使用过滤器。用null占位以免引起歧义。其次,我们注意到第三个参数为4,这是说在得到的JSON字符串中缩进四个空格。如下:

    {
        "name":"Mr Zhu",
        "age":21,
        "year":2016
    }
    

     我们还应该注意到,该方法在结果字符串中插入了换行符以提高可读性(只缩进不换行意义不大)。

     如果我们将第三个参数换为字符串而不是数字,比如:

    var jsonText=JSON.springify(person,null,"----");
    

     这时得到的结果是:

    {
    ----"name":"Mr Zhu",
    ----"age":21,
    ----"year":2016
    }
    

     即字符串将代替空格完成缩进任务。

      4.最后,我再来谈谈toJSON()方法,虽然这不是”第四个参数“,但是该方法也是将JavaScript对象序列化为JSON字符串,并且同样具有过滤器的作用。  

      先看以下实例:

    var person={
        name:"Mr Zhu",
        age:21,
        year:2016
        toJSON:function(){
                   return this.name;
        } 
    };
    var jsonText=JSON.stringify(person,null,4);
    

     请注意:toJSON()方法是用在JavaScript的对象字面量中的。 我们可以得到以下结果:

    {
        "name":"Mr Zhu"
    }
    

     即最终就只剩下”name“了,便是toJSON()方法的过滤器作用。

    !!! 在序列化为JSON字符串时,一定要理解序列化的内部顺序:

    1. 如果存在toJSON()函数且能通过它取得有效的值,则调用该方法,否则,返回对象本身。
    2. 如果提供了第二个参数,则需要运用这个函数过滤器的值,且传入函数过滤器的值就是 1 返回的值。
    3. 对 2 返回的每个值进行相应的序列化。
    4. 如果提供了第三个参数,执行相应的格式化。

    四.将JSON字符串解析为JavaScript值。

      将JSON字符串解析为JavaScript值需要JSON.parse()方法,该方法接收两个参数,第一个参数时保存JSON字符串的变量,第二个参数是一个函数。第一个参数没什么好说的,主要是第二个参数,它被称为还原函数这个函数也接受两个参数,一个键和一个值,并且返回一个值。这个还原函数同替换函数一样,将在每个键值对儿上调用。比如:

         

    var person={
        name:"Mr Zhu",
        age:21,
        year:2016,
        successDate:new Date(2016,9,18)
    };
    var jsonText=JSON.stringify(person);
    var personCopy=JSON.parse(jsonText,function(key,value){
        if(key="successDate"){
           return new Date(value);
        }else{
           return value;
        }
    });
    alert(personCopy.successDate.getFullyear());
    

       首先,我先为对象增加了一个seccessDate属性,该属性保存着一个Date对象,然后序列化为JSON字符串,最后再解析为JavaScript值,解析的过程中,键值对儿会一次传入还原函数中,name 、age、year不会改变,而successDate会基于相应的值创建一个新的Date()对象。这样,我们最后才能基于这个对象调用getFullYear()方法。

        

       

            注:说说JSON和JSONP,也许你会豁然开朗 这篇文章讲到了JSON和JSONP,我认为讲解的非常好,大家可以看一看。

    事实上,成功仅代表了你工作的1%,成功是99%失败的结果,所以,不要惧怕失败。

      

      

      

      

      

  • 相关阅读:
    [AH2017/HNOI2017]礼物
    [八省联考2018]林克卡特树lct
    [洛谷P4847]银河英雄传说V2
    [洛谷P4999]烦人的数学作业
    [洛谷P4171][JSOI2010]满汉全席
    [CF785E]Anton and Permutation
    [洛谷P2511][HAOI2008]木棍分割
    [洛谷P4430]小猴打架
    [UVA307]小木棍 Sticks
    [LOJ #6433]「PKUSC2018」最大前缀和
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/5988825.html
Copyright © 2020-2023  润新知