JSON必知必会
概要
前三章 JSON语法
第四章 Schema做一致性检验
第五章 安全问题
第六章 Ajax,API,跨域和JSON-P
— 下面几章就很浅了 —
第七章 jQuery,Angular框架
第八章 NoSQL
第九章 服务端的JSON
第十章 JSON作为配置文件
JSON语法
JSON语法是JavaScript的真子集,但它是独立于编程语言的一种数据交换格式。
数据交换格式的核心是数据,所以 JSON 中并不会涉及 JavaScript 对象字面量中的函数。JSON 所基于的 JavaScript 对象字面量单纯指对象字面量及其属性的语法表示。这种属性表示方法也就是通过名称 - 值对来实现的。
名称只能用双引号包裹,里面名称甚至可以放单引号。但是 ↓
命名规范
为了获得最大可移植性,应尽可能避免使用空格或特殊字符。 JSON 中的名称 - 值对的名称如果被系统作为对象装入内存的话,将会成为“属性”。在部分系统中,属性名可以包含下划线或数字,但是大多数情况下最好是使用英文字母 A~Z 或 a~z。
——我选择驼峰
JSON对象
有意思所以。。
注意逗号
如果你在名称 - 值对列表的结尾处加上一个逗号,你给机器的指令是“一个新部分的开始”,但是后面什么都没有。
JSON的媒体类型
当你在传递数据时,需要提前告知接收方数据是什么类型,这就会涉及媒体类型。媒体类型也有一些你可能听过的其他称呼,如“互联网媒体类型”“内容类型”或“MIME 类型”。它使用“类型 / 子类型”这种格式来表示,比如你可能见过的 text/html。
JSON 的 MIME 类型是 application/json。
互联网数字分配机构(Internet Assigned Numbers Authority,IANA)维护着一个包含全部媒体类型的列表(http://www.iana.org/assignments/media-types/media-types.xhtml)。
JSON Schema
🔗JSON Schema 规范(中文版) (apifox.cn)
JSON Schema (schema意为格式)可以帮助回答下列问题:
- 值的数据类型是否正确? 可以具体规定一个值是数字、字符串等类型。
- 是否包含所需要的数据? 可以具体规定哪些数据是需要的,哪些是不需要的。
- 值的形式是不是我需要的? 可以指定范围、最小值和最大值
一个JSON Schema 文件,它就是JSON格式的。
1 | { |
本章提供的例子只是简介,是冰山一角。JSON Schema 还支持正则表达式(一种字符形式,比如电子邮件地址的格式)以及枚举类型(一个包含所有可能值的列表)。如果你希望深入掌握 JSON Schema,可以访问下面的链接,了解相关规范:
- JSON Schema 主页(http://json-schema.org/)
- JSON Schema 验证规范(http://json-schema.org/latest/json-schema-validation. html)
附加一个Linter知识:
是做语法验证的,而schema是检测语义是否合法
JS Linter 进化史 - 知乎 (zhihu.com)
JSON安全
跨站请求伪造
跨站请求伪造,即 CSRF(cross-site request forgery,读作 sea-surf),是一种 利用站点对用户浏览器信任而发起攻击的方式。CSRF 漏洞已经存在了很长时间,远比 JSON 出现得早。
跨站脚本攻击
注入攻击:依赖于将数据注入到 Web 应用程序以方便恶意数据执行或编译的攻击
总结
- 不要使用顶级数组。顶级数组是合法的 JavaScript 脚本,它们可以用
<script>
标签链接并使用。而如果是个对象,就不会被成功解析。 - 对于不想公开的资源,仅允许使用 HTTP POST 方法请求,而不是 GET方法。GET 方法可以通过 URL 来请求,甚至可以放在
<script>
标签中。 - 使用 JSON.parse() 来代替 eval()。eval() 函数会将传入的字符串编译并执行,这会让你的代码易被攻击。应仅使用 JSON.parse() 来解析 JSON 数据。
零碎
Web API
🔗Web API简介 - 学习 Web 开发 | MDN (mozilla.org)
Web API的服务内容和普通网站差不多,但是它并不是用来拿给人看的🐶
Web API 是通过 HTTP 服务进行交互的一组指令和标准。这些交互可以包括创建、读取、更新、删除(CRUD)等操作,且 Web API 都会有一份说明,概述如何使用这些指令和标准。 (是一个对诸如 HTML 或 JSON 文档等资源进行请求和响应的系统。这些文档使用URL经由 HTTP请求。)
Angular
适合MVC的框架,和React、Vue不同,提供了更完整的解决方案。
NoSQL
NoSQL,顾名思义,它不是一种关系型数据库。我们不能使用 SQL 从关联在一起的数据库表格的行和列中获取数据。
NoSQL 数据库的一个例子是键值对存储。键值对存储模型将数据简化为键值对。如果要将英语词典编入数据库,那么用键值对存储非常合适。每一个单词就是一个键,单词对应的定义就是键的值。对于比较简单的数据结构来说,使用这种数据库比使用传统的关系型数据库要合适。(如果想将一个地址的省、市、区、街道和邮政编码等数据相关联,该怎么办?如果需要这种关系,那最好还是使用关系型模型,毕竟将复杂的关系用一个文档来表示还是很有难度的。)
服务端JSON
ASP、PHP的:序列化,反序列化,请求json
发送JSON HTTP请求的其他方式:Ruby on Rails,Java,Node.js
配置文件
软件中经常会有配置文件或设置文件,它让我们可以不必重新编译就能修改设置。配置文件的格式有很多,有 INI 和 XML 等。每种格式都有优点和缺点。
现实中一个使用 JSON 作为配置文件的极佳例子就是 Node.js 默认的 JavaScript 包管理器:npm(文件名称为 package.json。该文件包含了每个包的具体信息,如名称、版本、作者、贡献者、依赖、脚本以及许可。由于json没有注释这一说法,想要加点说明时,可以用一个键值对"comment": "xxx"
来代替)。当然,它也被 AngularJS 和 jQuery 等其他框架使用。