JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集,采用完全独立于语言的文本格式。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

  1、语法

  JSON的语法可以表示三种类型的值:

  • 简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但是不支持Javascript中的特殊值undefined。
  • 对象:对象作为一种复杂数据结构,表示的是一种无序的键值对。每个键值对中的值可以是简单值,也可以是复杂数据类型的值。
  • 数组:数组作为一种复杂数据结构,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值可以是任何类型——简单值、对象或数组。

  下面详细介绍下这三种类型:

  1)、简单值:

  数值表示:5

  字符串表示:"Hello World!"

  JSON字符串与Javascript字符串最大的不同是,JSON字符串必须使用双引号(单引号会引发语法错误)。

  2)、对象:

  举一个Javascript对象来对比说明,下面是一个Javascript中的对象字面量:

  1. var man = {
  2. name: "McBye",
  3. age: 24
  4. };

  而在JSON中,这个对象字面量就必须写成:

  1. {
  2. "name": "McBye",
  3. "age": 24
  4. }

  可以看出三个区别:

    • 没有声明变量,这是因为JSON中没有变量的概念;
    • 没有末尾的分号,因为这不是Javascript语句,不需要分号;
    • 对象的属性必须加双引号。

  3)、数组:

  JSON数组采用的是Javascript中的数组字面量形式。举例如下:

  Javascript数组字面量:var man = ["McBye", 24, "pku", true];

  JSON中表示的同一个数组:["McBye", 24, "pku", true]

  可以看到,JSON数组也没有变量和分号。

  将数组和对象结合起来,可以构成更复杂的数据集合,例如上面的JSON数组可以扩充为以下:

  1. [
  2. [
         "name": "McBye",
  3.    "age": 24,
  4.   "college": [
  5.       "pku",
  6.         "eecs"
  7. ]
  8.   ],
      [
        "name": "King",
        "age": 20,
      ]
    ]

  2、解析与序列化:

  JSON流行的重要原因之一是,JSON数据结构可以和Javascript对象进行双向的解析。

  早期的JSON解析器基本上就是使用Javascript的eval()函数。由于使用eval()对JSON数据结构进行求值存在风险,因为可能会执行一些恶意代码。

  1)、JSON对象有两个方法:

  stringify()——用于把Javascript对象序列化为JSON字符串。

  1. var man = {
  2. name: "McBye",
  3. age: 24,
        skills: undefine,
        func: function(){//nothing happens...}
  4. };

  对上面的Javascript对象序列化:var jsonMan = JSON.stringify(man);

  默认情况下,JSON.stringify()输出的JSON字符串不包括任何空格或缩进,因此保存在manCopy中的字符串为:

  1. {"name":"McBye","age":24}

  在序列化Javascript对象时,所有的函数和原型成员都会被有意忽略,不体现在结果中,并且值为undefined的任何属性也会被跳过。结果中最终都是值为有效的JSON数据类型的实例属性。

  parse()——用于将JSON字符串解析为Javascript对象。

   var manCopy = JSON.parse(jsonMan);

  man和manCopy两个对象,除了JSON有意忽略的属性和函数之外,其他属性都是相同的,但即使没有这些被忽略的属性与函数,man和manCopy也是完全独立、没有关系的两个对象。

  2)、序列化选项:

  在实际使用stringify()函数的时候,除了要序列化的Javascript对象外,还可以再加两个参数,这两个参数用于指定以不同的方式序列化Javascript对象。第一个参数是过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。

  a、过滤结果:

  如果过滤器参数是数组,那么stringify()的结果中仅包含数组中列出的属性。还是以上面的那个例子说明:

  1. var man = {
  2. name: "McBye",
  3. age: 24,
        skills: "Javascript",
    };
    var jsonText = JSON.stringify(man, ["name", "skills"]);

  上面的jsonText的值应该是只包含"name"、"skills"两个属性的字符串:

  1. {"name":"McBye","skills":"Javascript"}

  如果第二个参数是函数,传入的函数接受两个参数,属性名和属性值。根据属性名可以知道怎么序列化对象中属性。为了改变序列化对象的结果,函数返回的值就是相应属性的值。要注意的是,如果函数返回了undefined,那么相应的属性会被忽略。

  1. var man = {
  2. name: "McBye",
  3. age: 24,
        skills: "Javascript",
    };
    var jsonText = JSON.stringify(man, function(key, value){
      switch(key):{
        case "name":
          return "King";
        case "age":
          return "secret";
        default:
          return value;
      }
    });

  经过这个函数过滤器之后,序列化的JSON字符串的结果是:

  1. {"name":"King","age":"secret","skills":"Javascript"}

  b、字符串缩进:

  JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示每个级别缩进的空格数。并且,只要传入有效的控制缩进的参数值结果字符串就会包含换行符,这是比较人性化的一个设置呢,不过最大缩进格数为10,超过10的话都会自动转换为10。

  c、toJSON()方法:

  给对象定义toJSON方法,可以返回其自身的JSON数据格式。可以为任何对象添加toJSON()方法。例如:

  1. var man = {
  2. name: "McBye",
  3. age: 24,
        skills: "Javascript",
        toJSON: function({return this.name;})
    };
    var jsonText = JSON.stringify(man);

  上述代码执行后jsonText中保存的字符串是"McBye"。

  toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序非常重要。序列化一个对象的顺序如下:

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

  

  参考资料:《Professional Javascript for Web Developers》,Nicholas C.Zakas

Javascript:JSON总结的更多相关文章

  1. JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString

    JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...

  2. JavaScript JSON timer(计时器) AJAX HTTP请求 同源策略 跨域请求

    JSON 介绍 1. JSON: JavaScript Object Notation 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是 ...

  3. JavaScript -- JSON.parse 函数 和 JSON.stringify 函数

    JavaScript -- JSON.parse 函数 和 JSON.stringify 函数 1. JSON.parse 函数: 使用 JSON.parse 可将 JSON 字符串转换成对象. &l ...

  4. 细读 php json数据和JavaScript json数据

    关于JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级数据格式,占用字符数量极少,特别适合互联网传递: 4.可读性较强 5.容 ...

  5. JavaScript JSON AJAX 同源策略 跨域请求

    网页和Ajax和跨域的关系 1 Ajax使网页可以动态地.异步地的与服务器进行数据交互,可以让网页局部地与服务器进行数据交互 2 Ajax强调的是异步,但是会碰到跨域的问题. 3 而有很多技术可以解决 ...

  6. javascript.json snippets vscode 注释

    vscode vue js里面的注释 javascript.json { // Place your global snippets here. Each snippet is defined und ...

  7. javascript json写法

    javascript json写法 var shuxing = {name:"super",sex:"19",work:"IT"}; 这个k ...

  8. JavaScript JSON 与 AJAX

    JavaScript JSON 与 AJAX JSON 是一种轻量的数据交互格式,与 AJAX 配合完成前端页面与服务端的信息传递,本文介绍 JSON 的使用.原生 AJAX 写法.JSONP 跨域解 ...

  9. javascript json字符串与对象相互转换

    在实际项目中,经常遇到字符格式的问题,记下来以便日后方便查看.用到两个函数:JSON.stringify() 和 JSON.parse(). 使用ajax向后台请求数据,后台给前端返回数据,明明后端脚 ...

  10. Sublime Text插件:HTML+CSS+JAVASCRIPT+JSON快速格式化[转]

    今天在github上乱逛,无意间找到victorporof分享的htmlpretty插件,特做推荐: 先看看他是怎么描述htmlpretty的: This is a Sublime Text 2 an ...

随机推荐

  1. uwp如何建立任何形状的头像,如圆形,方形,六边形等

    最近掌上英雄联盟更新了新的界面,其中“我”界面的更新比较大,我目前还在加紧跟进.在做这个界面的时候,这个头像我想了一下,其实挺好解决的.先上个原图 这个头像一开始我也完全找不到头绪,然后我把头像放大了 ...

  2. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

  3. SVN-让项目不包括Bin和Obj

    方案一: 方案二: 方法三: 添加自定义文件夹或者文件的过滤 eg:.svn .git .vs obj bin  *.o *.lo *.la *.al .libs *.so *.so.[0-9]* * ...

  4. HTML5系列:HTML5本地存储

    1. Web Storage存储 HTML4在客户端存储数据通常使用Cookie存储机制将数据保存在用户的客户端,但使用Cookie方式存储客户端数据存在一系列的制约发展因素,如限制存储数据空间大小. ...

  5. ScrollView中嵌套GridView,ListView只显示一行的解决办法

    转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView, ...

  6. Android之SqlLite数据库使用

    每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的.与操作系统无关的SQL数据库—SQLite.SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据 ...

  7. 【tomcat】不同域名解析到同一tomcat不同项目上

    问题: 1. 有多个域名,想输入的每个域名只能访问其中的一个项目 2. 这些项目都部署在同一个tomcat上的 解决步骤:      1.首先把所有域名都解析到这台服务器上,解析时只能填写ip地址,不 ...

  8. js 根据屏幕大小调用不同的css文件

    原因:屏幕大小不一样,网站看起来总觉得怪怪的,所以,针对不同大小的屏幕,写了不同的css,写完了,要解决的问题就是:怎么根据屏幕的大小来引用不同的CSS,下面就是解决方法了. 解决方法:首先,在hea ...

  9. KVC & KVO

    KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value  Observing的简写,是键值观察的意思.那么我们能拿KV ...

  10. 如何用Python实现杨辉三角和心

    1. 如何实现杨辉三角 import copy list=[] newlist=[] def Fibonacci(list,n): newlist.append(0) if n ==1: return ...