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()方法。

JSON总结的更多相关文章

  1. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. .NET Core系列 : 2 、project.json 这葫芦里卖的什么药

    .NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...

  6. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  7. JSON.parse()和JSON.stringify()

    1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...

  8. json与JavaScript对象互换

    1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...

  9. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  10. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

随机推荐

  1. RSA+DES动态加密

    RSA可以用于加密,其加密强度很高,被人攻克的可能性极小.但是其加密速度很慢,如果对一段长数据进行加密是不现实的.因为无论加密还是解密都需要很长时间.所以通常是先用对称加密算法(DES, AES等)对 ...

  2. 视觉机器学习读书笔记--------BP学习

    反向传播算法(Back-Propagtion Algorithm)即BP学习属于监督式学习算法,是非常重要的一种人工神经网络学习方法,常被用来训练前馈型多层感知器神经网络. 一.BP学习原理 1.前馈 ...

  3. java测试框架整理

    Test: Junit4+Hamcrest 不多说了,就靠着两个 import static org.hamcrest.Matchers.equalTo; import static org.juni ...

  4. php 入门1

    一.php在引入文件和js引入文件的区别 1.php在引入文件是用代码控制,而js是通过标签的属性src引入: 2.php引入可以在引入下写代码,而js是不可以的 3.静态效果的js可以引入的时间,引 ...

  5. Java c3p0连接池之二

    <?xml version="1.0" encoding="UTF-8"?> <!-- c3p0-config.xml文件配置 --> ...

  6. Go并发控制之sync.WaitGroup

    WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...

  7. 原生js拖拽

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. rhel 7.0, windows10双系统grub2设置

    因为在win10基础上装了rhel7,但是启动时却没有win10的启动项,下面的方法解决此问题. $ su #root登录 $ cd /boot/grub2 1. 简单执行grub2-mkconfig ...

  9. python numpy包

    在numpy包中我们可以用数组来表示向量,矩阵和高阶数据结构 首先导入numpy包: from numpy import* 初始化numpy数组有多种方式,比如说 1.python列表或元祖 2.使用 ...

  10. Quartus II USB-Blaster驱动解决

    Quartus II USB-Blaster驱动解决 之前安装Quartus II 13.0,但FPGA开发板链接的USB-Blaster链接无法被Quartus识别,改装Quartus II 11. ...