[toc]
JSON必知必会
学习网站:SafariBooksOnline
它是什么?
我可以用它做什么?
那些别有用心的人会用它做什么?
目录概述:
第1~4章:JSON基础知识:
语法
语法验证
数据类型
模式验证
第5章:研究JSON的安全问题
介绍客户端和服务端的概念
回答那些别有用心的人会用它做什么
第6~9章:JSON是如何在代码中使用的
重点介绍了jQuery、AngularJS、CouchDB等技术的进阶知识
其他章节: 回答JSON作为数据交换格式所扮演的种种角色,我们可以使用它做什么?
章节目录
语言的学习并没有学习编程中通用的概念重要
第一章:什么是JSON?
1.1 JSON是一种数据交换格式
1.2 JSON独立于编程语言
1.3 专业数据和概念
笔记:
语言的学习并没有学习编程中通用的概念重要
我们使用JSON,即:我们使用的是一种 基于
对象表示法的 数据交换格式
JSON : JavaScript对象表示法(JavaScript Object Notation)
表示法:一个用于表示诸如数字或单词等数据的字符系统
数据交换格式:用于在不同系统或者平台之间交换数据的文本(所追求的重要指标:可移植性)
可移植性:在平台系统之间传输信息的兼容性
第二章:JSON语法
2.1 JSON基于JavaScript对象字面量
- literal释义
- 英语中 : 字面上的 :是一个形容词, 用来表示所说的话和所表达的是其字面的意思
- 编程语言中: 字面量 :是一个名词,是对数据值的具体表示
eg : x = 5 : x 表示变量 5是字面量
- JSON是基于JavaScript 对象字面量的。
注意是基于,原因是:在JavaScript中,对象里面常常包含函数,因此我们不能直接使用JavaScript的对象来表示鞋子具体的属性,还能创建一个walk函数。而且,数据交换的核心是数据,因此JSON中不会涉及JavaScript对象字面量中的函数。
即:JSON 所基于的JavaScript对象字面量 ,单纯是指对象字面量 及其属性的语法表示,这种属性的表示方法是通过名称-值对来实现的。
2.2 名称 - 值对
"animal" : "cat"
2.3 正确的JSON语法
名称:始终需要被双引号包裹。双引号中的名称可以是任何有效的字符串。
- 推荐 :
”myAnimal“ : ”cat“
- 合法但是不推荐 :
“My animal” : ”cat“ // 名称可以包含空格
”Library's animal“ : ”cat“ //名称可以包含单引号
- 不推荐原因:这样做降低了JSON数据的可移植性.
- 原因描述:JSON作为一种 基于对象表示法的
数据交换格式
,所追求的重要指标就是可移植性
。
而使用空格和特殊字符(即 az,09除外的字符)忽略了可移植性**.因此,为了获取最大可移植性,我们应该尽可能的避免使用空格或者特殊字符。
值:并不总是需要被双引号包裹。
当值是 字符串 的时候,必须 使用双引号包裹;
当值是 数字 、布尔值、数组、对象、null等其他数据类型的时候,都不应该被双引号包裹。
构建JSON:了解构建一个对象的语法(骑士册封仪式 : “JSON先生,我在此封你为对象”)
{
“animal” : "cat",
"color" : "orange"
}
-
从机器角度理解JSON语法
与人不同,机器是完全遵守规则和指令的
。当我们在一个字符创类型外面使用下列字符的时,实际上是告诉机器 : 如何读取数据 的指令
。- { 开始读取对象
- } 结束读取对象
- [ 开始读取数组
- ] 结束读取数组
- : 分割 名称和值
- , 一个新部分的开始
注:
例 1: 不能通过验证的“JSON
{
title : "This is my titile",
body : "This is my body"
}
错误 : 验证器会抛出一个 解析错误。
原因 : 名称没有加上双引号。如果名称没有加上双引号,则表示这是一个JavaScript对象,而不是JSON。
例 2. 不合法的JSON(单引号)
{
‘title’ : ‘This is my titile’,
’body‘ : ’This is my body‘
}
例 3. 合法JSON
{
"title" : "This is my titile",
”body" : "This is my body"
}
2.4 语法验证
工具:
- JSON Formatter & Validator
- JSON Editor Online
- JSONLint
2.5 JSON文件
*.json文件
2.6 JSON的媒体类型
JSON 的MIME类型是application / json
- 涉及媒体类型时机 : 在传输数据时,需要提前告知接收方数据是什么类型,这就涉及媒体类型。
- 媒体类型的别称:如 互联网媒体类型、内容类型 或者 MIME类型。
- 表示 : 它使用 “类型/子类型”这种格式来表示,如 :text / html
第三章 JSON数据类型
提前了解并学会使用一样事物是很有用的,无论是在计算机世界中,还是在现实世界中。
3.1 数据类型简介
原始数据类型:在不同编程语言中一成不变的数据类型通常叫做原始数据类型。
4.1 数据类型简介
4.1 数据类型简介
:原始数据类型*:在不同编程语言中一成不变的数据类型通常叫做原始数据类型。
- 数字
- 整型
- 浮点数
- 定点数 - 字符和字符串
- 布尔类型
3.2 JSON中的数据类型
由于JSON是基于对象字面量表示法 以及 对象数据类型的,你可能觉得让它作为数据交换格式有点不妥。原因是,数据交换格式:是以让不同的两个>系统之间能够进行交流为目的,这一格式所表达的必须是共有的部分。
记住:复合数据类型对象 的 数据结构 可以 被解构为 原始的数据类型。
因此,即使对于那些不支持对象数据类型的语言来说,一旦这个数据结构能够被解构为 原生的数据类型,就很好处理了。
JSON中的数据类型
- 对象
- 字符串
- 数字
- 布尔值
- null
- 数组
3.3 JSON中的对象数据类型
{
"person" : {
"name" : "lindsay bassett",
"head" : {
"hair" : {
"color" : "light blond",
"length" : "short"
},
"eyes" : "green"
}
}
}
3.4 JSON中的字符串类型
在JavaScript中,使用单引号或者双引号没有区别。然而,JSON不是JavaScript对象字面量,它只是基于JavaScript对象字面量。在JSON中,仅允许使用双引号包裹字符串。
注意:由于JSON解析器来说` " { } ,[ ] `都是解析的指令,因此对于除了a~z ,A~Z字符构成的字符串,JSON中对于 字符串中 其具有特殊含义 的 字符串 的识别 需要 转译。JSON中除了" \
还需要转译以下字符:
- \ / (正斜线)
- \ b (退格符)
- \ f (换页符)
- \ t (制表符)
- \ n (换行符)
- \ r (回车符)
- \ u后面跟十六进制字符 Unicode编码
3.5 JSON中数字类型
- 整型、浮点
3.6 JSON中的布尔类型
- true / false
3.7 JSON中的null类型
对于 不存在 或者 未定义 的属性的值,使用 null 来描述。
注意 不要把null 与undefined 混淆
- undefined : 不是JSON中的数据类型。
- 在JavaScript中 :
undefined 与那些 声明的名称 和 值 都不存在 的 对象 或者 变量 有关;
null 仅与对象 或 变量 的值有关。null 表示的是一个没有值的值.JSON中null 必须使用 小写形式
。
3.8 JSON中的数组类型
- 在JSON中,数组里可以包含任何支持的数据类型。
- JSON 是一种数据交换格式,如果将JSON数据传递给一个不使用JavaScript的系统,那么在解析时可能出错。
3.9 概念
- 对象 和 数组的区别:
- 对象 是 名称-值对 组成的 列表 或者 集合。
- 数组 是 值 构成的 列表 或者 集合。数组中所有的值都应该具有相同的 数据类型。
第四章 JSON Schema
4.1 验证的魔力
4.2 JSON Schema 简介
4.3 专业术语和概念
第五章 JSON中的安全问题
JSON本身不会构成什么威胁,因为本身它就是一种数据交换格式。它不过是一种数据文件或者数据流。真正能产生安全问题的是 JSON的使用。该章节重点讨论在
WEB中使用JSON时最常见的两个安全问题:跨站脚本伪造
和 跨站脚本攻击
。
5.1 客户端和服务端的关系
举例:
- 客户端 就是发生在浏览器中的一切;
- 服务端 则是发生在 运行网站的 服务器 中的一切;
- 关系描述:互联网浏览器(客户端) 和 网站(服务端) 之间的关系 就像我们去餐厅吃饭时,我们(客户)和餐厅的关系,这一关系中包含了大量的请求和响应。我们请求的是一份晚餐,厨房的响应则是 将我点的菜做出来,并送到我面前,展示给我们。
-
举个栗子:
- 假如你正在喜欢的网站上看可爱的小猫的图片,那么此时
你电脑当上的互联网浏览器就是客户端,而运行着可爱小猫图片的网站的电脑 就是 服务端
。你的浏览器通过互联网将你的请求发送给小猫图片网站的服务器,服务器接着就会把对应的页面作为响应发送给你。接下来,你的浏览器就会将页面在屏幕上渲染出来。 - 在这一关系中,我们称
图片网站返回的即将被浏览器处理的响应为
客户端的代码;将页面返回响应传递过来之前所发生的事
,称为服务器代码。
- 假如你正在喜欢的网站上看可爱的小猫的图片,那么此时
笔记:
我去餐厅就餐这件事情中:
我是客户端
餐厅是服务端
我向服务员点餐:
我拿着我餐桌位置的标识,向服务员描述我的需求,服务员在知道我的需求 和 我的置后,拿着我的请求信息向厨房发起一个请求,厨房接收服务员传递过来的信
息,经过处理加工,把对应请求内容的食物做好后,由服务员拿着我的位置信息和做好的晚餐,对我刚刚的请求做出一个响应,即:将食物送到我的餐桌上,然后我就能够享用了。
在这一关系中:
我 是 客户端,
餐厅 是 服务端,
厨房 是 服务器
我对应的 餐桌 是 客户端浏览器,
服务员 是 互联网+浏览器,
我点的单 是 我通过浏览器和互联网 向 服务器发送的请求
送到我桌子上的餐品 是 服务器给我的响应内容,由客户端浏览器解析后展示给我。
服务器给我的响应内容 是 客户端代码
服务器处理请求,得到响应内容,生成响应并发送的过程,称为 服务器代码。
5.2 跨站请求伪造
跨站请求伪造,即:CSRF(cross-site request gorgery,读作sea-surf),是一种利用
站点对用户浏览器的信任
而发起攻击的方式。CSRF漏洞已经存在了很长时间了,远比JSON早。
攻击原理:
- 合法JSON的不合法使用:有些合法的JSON十分危险,因为它也是可以执行的JS脚本。这样黑客就能够获取我们的信息。
例如:顶层JSON数组
(假设该例中的JSON中存储了你的个人信息)
[
{
"user" : "zhyingjia"
},
{
"phone": "123-123-1236"
}
]
- 浏览器 对 不同域名的站点 之间 进行资源分享有一定限制规则。但是使用<script></script标签能够绕开这些规则。
例如: 黑客站点的<script>标签可能是这样的
<script src = "[https: // www.yourspecialbank.com](https://www.yourspecialbank.com/)/user.json"></script>
- 关键:网站之间的信任凭证。
上面描述的攻击能够得以实现,很关键的一点就是利用了你和网站间的凭证
,没有你的凭证,<script>中的链接是不会返回任何东西的。
原因 :<script>
中的链接是一个动态链接,会根据登录用户的不同,而显示不同的敏感信息。
当你在网站登录时,便初始化了一个凭证,网站以此来确定你的身份。
CSRF 就是利用了这一信任关系。黑客为了利用这一信任,需要在你已登录银行账号的情况下访问其他含有危险 <script>
标签的网站。要实现这点,他事先会发送大量的伪造邮件,这些邮件会伪造的和你的银行发来的邮件一模一样,如果接受者没有好好查看一下发件人或者邮件中的链接是否指向可以信任的网站,那么就很可能点进去。
举个例子:
如果某一天你生病了或者精神状态不太好,不小心点开了这个链接。
如果,你这时你没有退出银行账号,那么你与银行之间的会话仍然存在。此时你与银行之间处于信任关系之中。
如果此时,你进入了坏人的网站,即使你马上意识到这个网站有点奇怪并且立刻关闭了它,也为时已晚了。
因为黑客已经获取到了敏感的 JSON 数据并发送发到了自己的服务器并且保存了起来。
那么,如何阻止 CSRF 攻击呢?
- 避免使用顶层 JSON 数组 :即
将数组存放到对象之中,使其成为非法的 JavaScript ,这样包含我们敏感数据的数组就不会被 <script> 标签加载
例如:
{
"info" : [
{
"user" : "zhyingjia"
},
{
"phone": "123-123-1236"
}
]
}
5.3 注入攻击
5.3.1 跨站脚本攻击
5.3.2 安全漏洞: 决策上的失误
5.4 专业术语和概念
第六章 JavaScript中的XMLHttpRequst与Web API
JavaScript中的XMLHttpRequst 与 Web API等概念听上去好像很难,但其实并没有那么复杂。它仅仅是一种简单的客户端与服务端的关系:JavaScript中的XMLHttpRequest负责在客户端发起请求,而WebAPI负责在服务端返回响应。
章节内容:上一章节, 我们曾经用餐厅的例子来说明服务端和客户端,服务端就是厨房,而客户端是来用餐的人。而和第一章关注的是其中的一类厨房,看看它是如何运作的。
简述:
1.互联网浏览器发送的是对某个资源的请求。上网时,我们通过点击一个指向URL的链接,或者直接在浏览器中输入URL。我们在浏览器中使用的URL通常指向一个HTML资源,它让我们看到我们的网站。在这种情况下,我们所请求的资源的内容类型是text/html.
2.另一种与我们不直接相关的客户端-服务端关系是WebAPI。通常情况下,它所需要的是获取数据。在这一章,我们将着眼于一种请求JSON资源(一种内容为application/json)的客户端,以及为这类顾客服务的餐厅:Web API.
6.1 WebAPI
Web API 是通过HTTP服务进行交互的一组指令和标准。这些交互可以包括:创建post、读取get、更新put、删除delete (CRUD)等操作。
JavaScrip在幕后进行这些操作,例如在某个页面请求天气数据,称为异步操作。
异步操作:通常指发生在幕后的,不会中断主进程的操作。
JavaScript中的异步操作: "主进程"指的是Web浏览器的显示进程。
例如:某个新闻页面可能包含一个实时显示天气的数据的侧边栏,在阅读新闻的时候,后台代码会每隔60s异步更新显示数据,而这一操作并不需要刷新页面,也不会对你阅读代码产生任何影响。
**AJAX与AJAJ : **Asynchronous JavaScript and XML/JSON(异步的JavaScript 和 XML/JSON).
6.2 JavaScript中的XMLHttpRequest对象
JavaScript中的XMLHttpRequest:是客户端主动去获取资源的代码。
XMLHttpRequest 描述:能够使用HTTP协议(超文本传输协议),来发送请求的代码 就是 XMLHttpRequest。
JavaScript中的XMLHttpRequest对象:JavaScript 是一种面向对象语言,而 XMLHttpRequest 就是一类对象。当使用 new XMLHttpRequest() ,并将其返回值赋值给一个变量时,它就具有了从某一地址请求资源的功能。
例:JavaScript中的XMLHttpRequest对象:
var myXmlHttpRequest = new XMLHttpRequest();