zoukankan      html  css  js  c++  java
  • 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()方法。

  • 相关阅读:
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 获取指定进程的输入命令行
    dotnet 获取指定进程的输入命令行
    PHP sqrt() 函数
    PHP sinh() 函数
    PHP sin() 函数
    PHP round() 函数
  • 原文地址:https://www.cnblogs.com/yufann/p/JS-Summary12.html
Copyright © 2011-2022 走看看