什么是JSON
宏观上看,
JSON 是一种轻量的数据格式,在各种地方传递数据。如果单用眼睛看,JSON 里的数据是被保存在花括号({})中的,而如果从用途上进一步分析,最终我们会得出结论:JSON 是一种数据交换格式,用于在不同的平台或系统间交换数据的文本。
JSON 的全称是 JavaScript Object Notation(JavaScript 对象表示法)。
JSON 基于 JavaScript 对象字面量。
重要概念:
- JSON 是一种数据交换格式。
- JSON 独立于编程语言(你不必先学习 JavaScript)。
- JSON 基于 JavaScript 对象字面量表示法(重点在于“表示法”)。
- JSON 表达数据的方式对通用的编程概念都很友好。
JSON语法
什么是字面量
对数据值的
具体表示。它的字面意思与其想要表达的意思是完全一致的。
x=5;
x = x + 5;
虽然我们没有看到 10,但我们知道 x 的值变成 10 了。在这个示例
中,x 就是变量,5 就是字面量。
正确的JSON语法
键值对的形式
其中键,也就是名称,始终需要被双引号包裹,名称内可以是任何有效字符串(可以使用空格和单引号,但尽量不要使用,因为会降低可移植性)
值并不总是需要被双引号包裹。当值是字符串时,必须使用双引号。而在 JSON 中,还有数字、布尔值、数组、对象、null 等其他数据类型,这些都不应被双引号包裹。
不能通过验证的“JSON”
{
title : "This is my title.",
body : "This is the body."
}
没有在名称两边加上双引号时,它并不是 JSON,而是一个 JavaScript 对象。单引号也是不被认可的!
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)。
重点总结:
• 字面量
指字面意思与其想要表达的意思是完全一致的值。
• 变量
通过形如 x 的标识符来表示的、可以修改的一类值。
• 最大可移植性(数据交换中)
通过保证数据本身对于平台和系统的兼容性来提供超越数据格式本身的可移植性。
• 名称 - 值对
指拥有名称和对应的值的属性或特征(也叫键 - 值对)。
• 语法验证
关注 JSON 格式的验证。
• 一致性验证
关注独特数据结构的验证。
我们还讨论了以下重要概念。
• JSON 基于 JavaScript 对象字面量中表示属性的语法,但是并不包含与JavaScript 对象字面量的函数相关的部分。
• 在 JSON 的名称 - 值对中,名称始终被双引号包裹。
• 在 JSON 的名称 - 值对中,值可以是字符串、数字、布尔值、null、对象或数组。
• JSON 中的名称 - 值对列表被花括号包裹。
• 在 JSON 中,多个名称 - 值对使用逗号分隔。
• JSON 文件使用 .json 扩展名。
• JSON 的媒体类型是 application/json。
JSON数据类型
毕竟数据交换格式是以让不同的两个系统间能够进行交流为目标的,这一格式所表达的必须是共有的部分。记住,复合数据类型对象的数据结构可以被解构为原始数据类型。即便是对那些不支持对象数据类型的语言来说,一旦这一数据结构被
解构为那些原生的类型,就很好处理了。
JSON 中的数据类型包括:
• 对象
• 字符串
• 数字
• 布尔值
• null
• 数组
必要的时候还需要利用反斜线来进行转义
需要转义的字符:
• /(正斜线)
• \b(退格符)
• \f(换页符)
• \t(制表符)
• \n(换行符)
• \r(回车符)
• \u 后面跟十六进制字符(如笑脸表情 \u263A)
例:
{
"location": "C:\\Program Files"
}
{
"story": "\\t Once upon a time, in a far away land \\n there
lived a princess."
}
这在大多数语言中都是不合法的:数组中混合着其他数据类型
{
"eggCarton": [
"egg",
null,
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
5,
"egg"
]
}
虽然在“大多数语言”中不合法,但在 JSON 中,这种混合使用数据类型的情况是合法的。
接下来我会告诉你为什么合法,以及为什么应该避免这样做。
在 JavaScript 中,你定义了一个变量。例如有一个名为something 的变量,我们将其赋值为数字 5。
在 JavaScript 中定义变量
var something = 5;
紧接着把这一变量的值改为一个字符串
something = "bob";
接下来再把它的值改成一个对象
something = { person: "bob" };
使用 var 声明的变量 something 的值可以是数字、字符串、数组、null 以及对象中的任意一种类型。
不过大多数语言都不允许变量的类型随意改变。
正常情况下,在声明变量时,也需要说明它们是整型、字符串还是对象。所以在声明 something 这个变量时,得用 int something = 5、string something = "bob" 或是 Person something = new Person("Bob")。
所以在大多数语言中,当声明一个数组时,也要声明所有容器中所保存的数据都应是什么类型,且之后不能随意修改。(原因应该是因为JS是一种弱类型语言)
既然JSON支持这种这种语法,为什么不建议用呢?因为
JSON 是 一 种 数 据 交 换 格 式。 如 果 将 JSON 数 据 传 递 给 一 个 不 使 用JavaScript 的系统,那么在解析时很可能会出错。
本节重要概念:
•JSON 中布尔类型的值只有 true 和 false,且所有字母必须小写(即
true,不能是 True 或 TRUE)。
• JSON 中 的 null 值 的 所 有 字 母 必 须 小 写( 即 null, 不 能 是 NULL 或
Null)。
• 对象和数组很关键的一个区别就是,对象是名称 - 值对构成的列表或集
合,数组是值构成的列表或集合。
• 对象和数组另一个关键的区别是,数组中所有的值应具有相同的数据
类型。
JSON Schema(模式)
在大多数情况下,数据交换格式中的数据通过互联网或其他网络传输到接收方。而接收方会对数据文件的格式,包括其结构和数据类型有一个预期。所以,接收方通常会提供一个文档来解释预期的格式并提供示例。
然而无论提供的文档多么详尽,数据都有可能会出错。要说明一点,我们在这里要探讨的不是语法错误而是一些诸如“我寄了一个苹果,但你想要的是橘子”这类出于误解的错误。本书将这类验证称为一致性验证(conformity validation),以此与语法验证区分开来。
序列化和反序列化:
序列化是将对象转换成文本的过程,
反序列化是将文本转换成对象的过程。
End
无论是作为服务器上的配置文件,还是作为通过 URL 请求的资源,JSON始终都在履行作为数据交换格式的职责
在服务端,对象可以被序列化为 JSON 格式的文本,并且通过反序列化变回对象。服务端代码可以请求 JSON。
此外,JSON 也可以被看作一种文本格式,用作一种面向文档存储类型的数据库的文档。从 JavaScript 对象到 JSON,再到服务端的对象,能够看到数据跑了一圈。每一天,数据都在全世界各种系统中进进出出,它们的载体就是数据交换格式。
我们再次从高空俯瞰,可以发现 JSON 并不是唯一一种数据交换格式。有些数据以逗号分隔值(CSV)为载体,还有些是 Excel 表格。它们都是表格化的。还有些数据以 XML 格式存在,这种格式支持数据的嵌套。
数据有多种格式与形式。有多种不同的系统在不停地推送和接收着数据。在考虑使用什么数据交换格式时,数据的形式和交换数据的系统都应该被考虑到。虽说本书青睐于 JSON,并对它进行了全方位的介绍,但要记住,JSON 不总是最佳选择。
例如,假设两个不同的系统需要交换库存数据,它们都使用表格的形式来存储这些数据,那就有必要将表格数据转换成对象的形式,序列化成JSON,再到另一个系统上转成对象,最后再转换成表格形式吗?答案是否定的,因为这样就等于专门为了使用 JSON 而南辕北辙了。应该为表格形式的数据选择一种更合适的数据交换格式,比如 CSV 或 tab delimited。由于多数系统都使用对象来为数据建模,所以 JSON 作为数据交换格式非常流行。数据常被保存在关系型数据库中。尽管关系型数据库使用表格,但实际上还是可以通过数据的关系来构成可以视为对象的实体。每个实体,如地址,都有一些“字段”,这些字段实际上就是名称 - 值对。