• JSON总结


    JSON:
      关于JSON,最重要的是要理解它是一种数据格式,不是一种编程语言。虽然JSON与JavaScript具有相同的语法形式与JSON具有相同的语法形式,但JSON并不从属于JavaScript,很多编程语言都有针对JSON的解析器

    1)json可以表示的类型:
      --简单值:使用与JavaScript相同的语法,可以在json中表示字符串,数值,布尔值,和null。但json不支持JavaScript中的特殊值undefined
      --对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型值。
      --数组:数组也是一种复杂数据类型,表示一组有序值的列表,可以通过数值索引,来防伪其中的值。数组的值也可以是任意类型——简单值,对象或数组
        JSON不支持变量,函数或者对象实例

      1.简单值:是JSON最简单的数据形式,如:数字 5 ,字符串:"hello word!"
        javascript字符串与JSON字符串相比最大的区别在于:JSON字符串必须使用双引号(单引号会导致语法错误),
        布尔值和null也是有效的JSON形式。但在实际中json多用于表示复杂的数据形式,所以简单值在实际应用较少。

      2.对象:
        JSON中的对象与JavaScript中的对象稍微有些不同。
        区别1:JSON中的对象要求给属性加上 双引号,JavaScript中对象字面量表示可以不给属性加 双引号
            JavaScript中对象字面量表示为:
              var person={
                name:"yuafn",   //可以不给属性name加 双引号
                age:20
              };
            但JSON中的对象要求给属性加上 双引号,实际上JavaScript中对象的字面量表示完全可以由JSON中的对象表示方法代替
              var person={
                "name":"yuafn",
                "age":20
              };

        区别2:JSON中没有变量的概念,所以并没有声明变量。其次,没有末尾的分号
            JSON表示上述对象为:
              {
                "name":"nike",
                "age":20,
                "Mon":{
                  "name":"nisa",
                  "age":45
                }
              }

        3.数组:
          JSON数组采用的就是JavaScript中的数组字面量形式。
          JavaScript中数组字面量:var arr=[21,"nike",false];
          JSON中数组表示:[20,"nike",true]
          注:与JSON对象一样,没有变量的声明,末尾没有分号。

          把数组和对象结合起来,可以表示更加复杂的数据集合
            [
              {
                "title":"JavaScript高级程序设计",
                "anothors":[
                    "Nicholas"
                ],
                "edition":3,
                "year":2011
              },
              {
                "title":"JavaScript高级程序设计",
                "anothors":[
                    "Nicholas"
                ],
                "edition":2,
                "year":2009
              },
              {
                "title":"JavaScript高级程序设计",
                "anothors":[
                    "Nicholas"
                ],
                "edition":1,
                "year":2006
              }
            ]


    2)解析与系列化
      我们都知道可以使用JavaScript中的eval()函数解析json,返回JavaScript对象或者数组
      因为JSON 文本格式在语法上与创建JavaScript对象的代码相同。
      由于这种相似性,无需解析器,JavaScript程序能够使用内建的eval()函数,用JSON数据来生成原生的JavaScript对象。
      实际上,eval() 函数可编译并执行任何 JavaScript 代码。这隐藏了一个潜在的安全问题。所以使用JSON解析器较为安全。
      其实,JSON对象也有自己的方法可以把JSON数据结构解析为有用的JavaScript对象,

      1.JSON对象
      ES5定义了全局对象JSON。支持这个对象的浏览器有:IE8+,FF,Chrome,Opera
      JSON对象的两个解析两个方法:
        --JSON.stringify():序列化作用,把JavaScript对象系列化为JSON字符串,
        --JSON.parse():解析作用,把JSON字符串解析为原生JavaScript值(对象,或数组)

      --JSON.stringify()
        var book={
          title:"JavaScript高级程序设计",
          anothors:[
              "Nicholas"
          ],
          edition:3,
          year:2011
        };
        var toJsonText=JSON.stringify(book);
        说明:上面的例子使用 JSON.stringify() 把一个JavaScript对象解析成一个JSON字符串,然后将它保存在变量toJsonText中,
            默认情况下,JSON.stringify() 输出的JSON字符串不包含任何空格字符或缩进,因此保存在变量toJsonText中的字符串为:
            {"title":"JavaScript高级程序设计","anothors":["Nicholas"],"edition":3,"year":2011}

      --JSON.parse()
          将JSON字符串直接传递给 JSON.parse() 就可以得到相应的JavaScript值
          var bookCopy=JSON.parse(toJsonText);    //可以创建与book类似的对象

        补充:当创建的JavaScript对象为一个数组对象时,也可以使用
              var book=[{
                title:"JavaScript高级程序设计",
                anothors:[
                    "Nicholas"
                ],
                edition:3,
                year:2011
              }];
              var toJsonText=JSON.stringify(book);  //是个JSON字符串
              alert(toJsonText);
              var arr=eval(toJsonText);  //eval()转换为对象或数组
              for (var i = 0; i < arr.length; i++) {
                alert(arr[i].title);
              }
              var bookCopy=JSON.parse(toJsonText);  //参数必须为一个JSON字符串,否则会出错
              alert(bookCopy[0].title);


    2.序列化选项:
      JSON.stringify()除了要序列化JavaScript对象以外,还接受两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象。
      所以JSON.stringify()一个可接受三个参数,第一个是要序列化的JavaScript对象,
      第二个参数:是个过滤器,可以是个数组,也可以是个函数
          1.当第二个参数为数组时,那么 JSON.stringify() 的结果中只包含数组中列出的属性
            var book={
              title:"JavaScript高级程序设计",
              anothors:[
                  "Nicholas"
              ],
              edition:3,
              year:2011
            };
            var toJsonText=JSON.stringify(book,["title","edition"]);
          说明:toJsonText变量中保存的是:{"title":"JavaScript高级程序设计","edition":3}

          2.当第二个参数为函数时,传入的函数接收两个参数,属性名(键名)和属性值,根据属性名可以知道应该如何处理要序列化对象中的属性。
            属性名只能是字符串,而在属性值并非键值对儿结果时,属性名可以是空字符串。
            如果函数返回了undefined那么相应的属性就会被忽略。
              var book={
                title:"JavaScript高级程序设计",
                anothors:[
                    "Nicholas"
                ],
                edition:3,
                year:2011
              };
              var toJsonText=JSON.stringify(book,function(key,value){
                switch(key){
                  case "another":
                    return value.join(",");   //如果键为"another",那么将数组连接成字符串
                  case "year":
                    return 5000;
                  case "edition":
                    return undefined;   //返回了undefined那么相应的属性就会被删除
                  default:
                    return value;
                }
              });
          说明:函数过滤器根据传入的键来决定结果。当函数运行时,传入对象book中的
          每一个键-值对儿将作为参数传进函数,而函数的返回值就是对应键的值。
          所以最后的JSON字符串为:
              {"title":"JavaScript高级程序设计","anothors":"Nicholas","year":5000}


      第三个参数:是一个可选的选项,表示是否在返回的JSON字符串中保留缩进。
        1.如果第三个参数是一个数字,表示的是每个级别缩进的空格数
            var book={
              title:"JavaScript高级程序设计",
              anothors:[
                  "Nicholas"
              ],
              edition:3,
              year:2011
            };
            var toJsonText=JSON.stringify(book,null,4);
            结果为:
                {
                    "title":"JavaScript高级程序设计",
                    "anothors":[
                        "Nicholas"
                    ],
                    "edition":3,
                    "year":2011
                }
          说明:我们可以看到,结果不仅缩进了四个空格,而且也结果字符串中换了行,其实只要传入了有效的控制缩进的参数,结果JSON字符串字符串就会包含换行符(只缩进不换行意义不大),最大缩进空格数为10,所有大于10的值会自动转换为10。

        2.如果参数是一个字符串,而非数值,则这个字符串将在转换后的JSON字符串中用作缩进字符,和数字类似




      3.解析选项:
        JSON.parse() 也会接收另外一个参数,该参数为函数(又称还原函数),和JSON.stringify() 接受函数参数时类似,都是在每个键值对上面调用。
        同样,如果函数返回undefined,表示要从结果中删除相应的键和属性,如果返回其他值,则表示该值插入到结果中。
          将日期字符串转换为Date()对象时,经常用到还原函数
          var book={
            title:"JavaScript高级程序设计",
            anothors:[
                "Nicholas"
            ],
            edition:3,
            year:2011,
            releaseDate:new Date(2016,3,12)
          };
          var toJsonText=JSON.stringify(book);
          var copyBook=JSON.parse(toJsonText,function(key,value){
              if(key=="releaseDate"){
                return new Date(value);
              }else{
                return value;
              }
          });
          alert(copyBook.releaseDate.getFullYear());  //2016
        说明:上面代码先为book对象新增一个releaseDate属性,属性值为Date()对象,这个对象经过序列化之后变成一个JSON字符串,然后经过解析又在
              copyBook还原一个Date()对象,所以能够调用该属性中的getFullYear()方法。

  • 相关阅读:
    (转)CSS3之pointer-events(屏蔽鼠标事件)属性说明
    Linux下source命令详解
    控制台操作mysql常用命令
    解决beego中同时开启http和https时,https端口占用问题
    有关亚马逊云的使用链接收集
    favicon.ico--网站标题小图片二三事
    网络博客
    Gitbook 命令行工具
    Markdown 轻量级标记语言
    SVN 集中式版本控制系统
  • 原文地址:https://www.cnblogs.com/yufann/p/JS-Summary12.html
Copyright © 2020-2023  润新知