JSON必知必会

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钦点

注意逗号

如果你在名称 - 值对列表的结尾处加上一个逗号,你给机器的指令是“一个新部分的开始”,但是后面什么都没有。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Cat",
"properties": {
"name": {
"type": "string"
"minLength": 3,
"maxLength" : 20
},
"age": {
"type": "number",
"description": "Your cat's age in years."
"minimum" : 0
},
"declawed": {
"type": "boolean"
}
},
"required": [
"name",
"age",
"declawed"
]
}

本章提供的例子只是简介,是冰山一角。JSON Schema 还支持正则表达式(一种字符形式,比如电子邮件地址的格式)以及枚举类型(一个包含所有可能值的列表)。如果你希望深入掌握 JSON Schema,可以访问下面的链接,了解相关规范:

附加一个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 等其他框架使用。

评论