你是否曾经疑惑过,当我们提到 JSON
的时候,我们在说什么?JSON
以 JS
开头,那么其与 JavaScript
的联系到底是什么?在这篇文章中,我们将尽可能通俗地了解 JSON
的起源、格式和意义,并解答一些常见的疑惑。
IMPORTANT标准
JSON
格式中不可以使用任何形式的注释。本文仅为了解释方便,使用了注释。在实际使用中请删除所有注释。
一、JSON 是什么
JSON
(JavaScript Object Notation,读作 Jason
) 是一种轻量级的数据交换格式,是基于 JavaScript
的一个子集。易于人阅读和编写,同时也易于机器解析和生成。这些特性使其成为理想的数据交换语言 1。
Crockford 率先设计并普及了 JSON
。源自当年对不依赖 Flash
& Java Applet
的实时 Server-to-Browser
通信协议的需求 2。
二、JSON 的格式
1. 基本结构
JSON
由三种元素组成 1,包括:
- Object: 记录无序的映射关系,在
Python
中称为字典(dict
),在一些语言中被称为映射(map
) - Array: 记录有序的数据集合,在
Python
中称呼为列表(list
) - Value:如其名,记录各种类型的数据,具体类型稍后解释
这些结构都是 language-independent
的,被大部分现代计算机语言以各种形式支持。这使跨编程语言,进行数据交换成为一种可能 1。
接下来将分别解释上面的概念。
2. JSON 语法
JSON Text
是数据经过序列化后的 JSON
字符串。可以是 Object
, Array
和 Value
3。
但是因为 Value
囊括了 Object
& Array
。所以一个非常简洁明了的等式是:
JSON Text = Value
3. Value
其中 Value
是一个比较特别的元素,包括了不同的类型 1,包括:
- Object & Array:嵌套的
Object
和Array
- String:被引号
""
包住的字符串 - Number:数字,包括
fixed
和float
- Boolean:布尔值,
true
或false
- Null:空值,在
Python
中对应None
Value
是一个基本概念,任何作为 Object
, Array
, String
, Number
, Boolean
, Null
的数据都算作是 Value
。
可以理解为只要是 Value
的地方实际上可以是上述任一类型的数据。(包括 JSON Text
的根元素)1 3
如果你略懂一点 Python
的 type hints
,那么我想用 Union
来解释 Value
会更加直观:
from typing import Union
Value = Union[Object, Array, str, int, float, bool, None]
4. Object
Object
是 JSON
非常重要的一个组成部分甚至不少人认为 JSON
必须以 {}
作为最外层元素(尽管这并不正确 3)。
Object
内含有数对 key-value
的映射关系,其形态如下:
{
"key1": <value1>,
"key2": <value2>,
"key3": <value3> // 最后一个元素不可以有逗号
}
在这里 key
必须是一个 String
,value
的类型则为 Value
。
key
和 value
之间用 :
分隔,key-value
之间用 ,
分隔。外面则用 {}
包裹 1。
前面提到过,Object
也是 Value
的一种 1,所以 Object
也可以作为 Value
的一部分。看下面这个例子:
{
"key1": { // 这里 key1 对应的 value 是一个 Object
"key2": "value" // 这里 key2 对应的 value 是一个 String
},
"key3": [1, 2, 3] // 这里 key3 对应的 value 是一个 Array
}
5. Array
Array
是 JSON
中的另一个重要元素,其形态如下:
[
<value1>,
<value2>,
<value3> // 最后一个元素不可以有逗号
]
和上面一样,这里的 value
也是 Value
类型的数据。value
之间用 ,
分隔,外面则用 []
包裹。1
同样,这里我们展示一下 Object
和 Array
作为 Value
的一个例子:
[
[1, 2, 3], // 这里是一个 Array
{
"key1": "value1",
}
]
6. String
String
是 JSON
中的一个基本数据类型,其形态如下:
"Hello, World!"
String
是由 "
包裹的字符序列。String
也是 Value
的一种。1
7. Number
Number
也是 JSON
中的一个基本数据类型,其形态如下:
123456
123.456
123456e-3
这里的 Number
包括了整数和浮点数。Number
也是 Value
的一种。1
8. Boolean
Boolean
,布尔值,作为基本类型的它只存在两个不同的数据:
true
false
Boolean
也是 Value
的一种。1
9. Null
Null
,空值,比 Boolean
还过分,只有一个数据:
null
Null
也是 Value
的一种。1
三、示例
{
"name": "cxzlw", // string
"age": 16, // number
"gender": "mtf", // also string(夹杂私货)
"balance": 123.45, // also number
"is_student": true, // boolean
"hobbies": [ // array of strings
"coding",
"reading",
"writing"
],
"friends": [ // array of objects
{ // 这里演示的是一个 Object 嵌套在 Array 中,再嵌套在另一个 Object 中
"name": "Alice",
"age": 18,
"is_student": true,
"balance": 123.45
},
{
"name": "Bob",
"age": 19,
"is_student": false,
"balance": 123.45
} // 末尾不能有逗号
] // 注意每个 [ 都要有与之配对的 ]
} // 同样 { 要有配对的 }
四、JSON 的意义
JSON
作为一种数据交换格式,其最大的意义在于其跨语言的特性。JSON
可以被大部分现代编程语言解析,这使得 JSON
成为了一种非常之理想的数据交换格式 1。
同时,随着前后端分离概念的出现,越来越多网站使用 JSON
格式在前后端之间交换数据。无论是进行 Web 开发,还是反过来进行数据抓取(爬虫),JSON
都是值得掌握的一种数据格式。
在不久后的 TeensCamp3 中,我们将会涉及到使用 JSON
来存储数据的项目。因此提前了解 JSON
的基本知识是非常有必要的。