456 lines
7.5 KiB
Markdown
456 lines
7.5 KiB
Markdown
JSON 备忘清单
|
||
===
|
||
|
||
这是理解和编写 JSON 格式配置文件的快速参考备忘单。
|
||
|
||
入门
|
||
----
|
||
|
||
### 介绍
|
||
|
||
[JSON](https://json.org/) 是一种基于文本的轻量级开放标准,专为人类可读的数据交换而设计。
|
||
|
||
- JSON 代表 JavaScript 对象表示法
|
||
- JSON 易于读写。
|
||
- JSON 是与语言无关的数据交换格式
|
||
- JSON 文件扩展名为 `.json`
|
||
- JSON Internet 媒体类型为 `application/json`
|
||
|
||
### 示例
|
||
|
||
```json
|
||
{
|
||
"name": "Jason",
|
||
"age": 39,
|
||
"height": 1.92,
|
||
"gender": "M",
|
||
"salary": 70000,
|
||
"married": true,
|
||
"children": [
|
||
{"name": "Tom", "age": 9},
|
||
{"name": "Ava", "age": 7}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 类型
|
||
|
||
| 类型 | 描述 |
|
||
|-----------|---------------------------------|
|
||
| `Number` | 双精度浮点 |
|
||
| `String` | 字符系列 |
|
||
| `Boolean` | “true”或“false” |
|
||
| `Array` | 有序的值序列 |
|
||
| `Value` | 字符串、数字、布尔值、空值等 |
|
||
| `Object` | 键/值对的无序集合 |
|
||
| `null` | Null 或 Empty |
|
||
|
||
### 字符串
|
||
<!--rehype:wrap-style=grid-row: span 3/span 3;-->
|
||
|
||
| | |
|
||
|------|----------------------------|
|
||
| `\"` | 双引号 Double quote |
|
||
| `\\` | 反斜杠 Backslash |
|
||
| `\/` | 正斜杠 Forward slash |
|
||
| `\b` | 退格 Backspace |
|
||
| `\f` | 换页 Form feed |
|
||
| `\n` | 换行 Newline |
|
||
| `\r` | 回车 Carriage return |
|
||
| `\t` | 标签 Tab |
|
||
| `\u` | 后跟四个十六进制数字 |
|
||
|
||
#### 示例
|
||
|
||
```json
|
||
{
|
||
"url": "https://jaywcjlove.github.io",
|
||
"msg" : "Hi,\n\"Quick Reference\"",
|
||
"intro": "为开发人员分享快速参考和备忘单"
|
||
}
|
||
```
|
||
|
||
#### 无效字符串
|
||
|
||
```json
|
||
{ "foo": 'bar' }
|
||
```
|
||
|
||
Have to be delimited by double quotes
|
||
|
||
### 数字
|
||
<!--rehype:wrap-class=row-span-2-->
|
||
|
||
类型 | 说明
|
||
-----|------
|
||
`Integer` | 数字 1-9、0 和正数或负数
|
||
`Fraction` | 0.3、3.9 等分数
|
||
`Exponent` | 指数,如 e、e+、e-、E、E+、E
|
||
<!--rehype:className=show-header -->
|
||
|
||
#### 示例
|
||
|
||
```json
|
||
{
|
||
"positive" : 12,
|
||
"negative" : -1,
|
||
"fraction" : 10.25,
|
||
"exponent" : 1.0E+2,
|
||
"zero" : 0
|
||
}
|
||
```
|
||
|
||
#### 无效的数字
|
||
|
||
```json
|
||
{ "foo": 0xFF }
|
||
```
|
||
|
||
在JSON中,只能使用十进制文字
|
||
|
||
### 对象 Objects
|
||
|
||
```json
|
||
{
|
||
"color": "Purple",
|
||
"id": "210",
|
||
"composition": {
|
||
"R": 70,
|
||
"G": 39,
|
||
"B": 89
|
||
},
|
||
"empty_object": {}
|
||
}
|
||
```
|
||
|
||
用逗号分隔的多个键/值对
|
||
|
||
### 数组 Arrays
|
||
|
||
```json
|
||
[1, 2, 3, 4, 5]
|
||
```
|
||
|
||
以 `[` 开始并以 `]` 结束
|
||
|
||
### 对象数组
|
||
|
||
```json
|
||
{
|
||
"children": [
|
||
{ "name": "Jimmy Smith", "age": 15 },
|
||
{ "name": "Sammy Sosa", "age": 12 }
|
||
]
|
||
}
|
||
```
|
||
|
||
### 数组对象
|
||
|
||
```json
|
||
{
|
||
"attributes": ["a1", "a2"],
|
||
"methods": ["getter", "setter"],
|
||
"empty_array": []
|
||
}
|
||
```
|
||
|
||
### 二维阵列
|
||
|
||
```json
|
||
{
|
||
"my_sequences": [
|
||
[1, 2, 3],
|
||
[4, 5, 6],
|
||
[7, 8, 9, 0],
|
||
[10, 11]
|
||
]
|
||
}
|
||
```
|
||
|
||
### 对象的对象
|
||
|
||
```json
|
||
{
|
||
"Mark McGwire": {
|
||
"hr": 65,
|
||
"avg": 0.278
|
||
},
|
||
"Sammy Sosa": {
|
||
"hr": 63,
|
||
"avg": 0.288
|
||
}
|
||
}
|
||
```
|
||
|
||
### 嵌套
|
||
|
||
```json
|
||
{
|
||
"Jack": {
|
||
"id": 1,
|
||
"name": "Franc",
|
||
"salary": 25000,
|
||
"hobby": ["a", "b"],
|
||
"location": {
|
||
"country": "A", "city": "A-A"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
JSON 5
|
||
----
|
||
|
||
### Objects
|
||
|
||
对象键可以是 ECMAScript 5.1 [IdentifierName](https://www.ecma-international.org/ecma-262/5.1/#sec-7.6)
|
||
|
||
```json
|
||
{
|
||
width: 1920,
|
||
height: 1080,
|
||
}
|
||
```
|
||
|
||
数组可以有一个尾随逗号
|
||
|
||
```json
|
||
[
|
||
1,
|
||
true,
|
||
'three',
|
||
]
|
||
```
|
||
|
||
### 允许单行和多行注释
|
||
|
||
```js
|
||
{
|
||
// 一行注释
|
||
"name": "Kenny"
|
||
}
|
||
```
|
||
|
||
多行注释
|
||
|
||
```js
|
||
{
|
||
/* 这是一个
|
||
多行注释 */
|
||
"name": "Kenny"
|
||
}
|
||
```
|
||
|
||
### 允许附加空白字符
|
||
|
||
代码点 | 描述
|
||
:-- | ---
|
||
`U+0009` | 水平制表符
|
||
`U+000A` | 换行符
|
||
`U+000B` | 垂直制表符
|
||
`U+000C` | 换页符
|
||
`U+000D` | 回车符
|
||
`U+0020` | 空格
|
||
`U+00A0` | 不间断空格
|
||
`U+2028` | 行分隔符
|
||
`U+2029` | 段落分隔符
|
||
`U+FEFF` | 字节顺序标记
|
||
Unicode Zs 类别 | 空格分隔符 Unicode 类别中的任何其他字符
|
||
<!--rehype:className=left-align-->
|
||
|
||
### 数字
|
||
|
||
数字可能有前导或尾随小数点
|
||
|
||
```json
|
||
{
|
||
integer: 123,
|
||
withFractionPart: 123.456,
|
||
onlyFractionPart: .456,
|
||
withExponent: 123e-456,
|
||
}
|
||
```
|
||
|
||
数字可以是十六进制
|
||
|
||
```json
|
||
{
|
||
positiveHex: 0xdecaf,
|
||
negativeHex: -0xC0FFEE,
|
||
}
|
||
```
|
||
|
||
数字可以是正无穷大、负无穷大和 NaN。
|
||
|
||
```json
|
||
{
|
||
positiveInfinity: Infinity,
|
||
negativeInfinity: -Infinity,
|
||
notANumber: NaN,
|
||
}
|
||
```
|
||
|
||
数字可以以明确的加号开头
|
||
|
||
### 字符串
|
||
<!--rehype:wrap-class=col-span-2-->
|
||
|
||
```js
|
||
'Lorem ipsum dolor sit amet, \
|
||
consectetur adipiscing elit.'
|
||
```
|
||
|
||
以下是代表相同的意思
|
||
|
||
```js
|
||
'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||
```
|
||
|
||
```json
|
||
'\A\C\/\D\C'
|
||
```
|
||
|
||
以下是代表相同的意思
|
||
|
||
```json
|
||
'AC/DC'
|
||
```
|
||
|
||
在 JavaScript 中访问 JSON
|
||
----
|
||
|
||
### 访问对象
|
||
|
||
```javascript
|
||
let myObject = {
|
||
"name": "Jason",
|
||
"last": "Doe",
|
||
"age": 39,
|
||
"gender": "M",
|
||
"salary": 70000,
|
||
"married": true
|
||
};
|
||
```
|
||
|
||
----
|
||
|
||
| | |
|
||
|--------------------|-----------|
|
||
| `myObject.name` | "Jason" |
|
||
| `myObject["name"]` | "Jason" |
|
||
| `myObject.age` | 39 |
|
||
| `myObject.other` | undefined |
|
||
| `myObject[0]` | undefined |
|
||
|
||
### 访问嵌套
|
||
<!--rehype:wrap-style=grid-row: span 2/span 2;-->
|
||
|
||
```javascript
|
||
let myObject = {
|
||
"ref": {
|
||
"name": 0,
|
||
"last": 1,
|
||
"age": 2,
|
||
"gender": 3,
|
||
"salary": 4,
|
||
"married": 5
|
||
},
|
||
"jdoe": [
|
||
"Jason",
|
||
"Doe",
|
||
39,
|
||
"M",
|
||
70000,
|
||
true
|
||
],
|
||
"jsmith": [
|
||
"Tom",
|
||
"Smith",
|
||
42,
|
||
"F",
|
||
80000,
|
||
true
|
||
]
|
||
};
|
||
```
|
||
|
||
----
|
||
|
||
| | |
|
||
|--------------------------|--------------------------|
|
||
| `myObject.ref.age` | 2 |
|
||
| `myObject["ref"]["age"]` | 2 |
|
||
| `myObject.jdoe` | ["Jason", "Doe", 39 ...] |
|
||
| `myObject.jsmith[3]` | "F" |
|
||
| `myObject[1]` | undefined |
|
||
|
||
### 访问对象数组
|
||
<!--rehype:wrap-style=grid-row: span 2/span 2;-->
|
||
|
||
```javascript
|
||
let myArray = [
|
||
{
|
||
"name": "Jason",
|
||
"last": "Doe",
|
||
"age": 39,
|
||
"gender": "M",
|
||
"salary": 70000,
|
||
"married": true
|
||
},
|
||
{
|
||
"name": "Tom",
|
||
"last": "Smith",
|
||
"age": 42,
|
||
"gender": "F",
|
||
"salary": 80000,
|
||
"married": true
|
||
},
|
||
{
|
||
"name": "Amy",
|
||
"last": "Burnquist",
|
||
"age": 29,
|
||
"gender": "F",
|
||
"salary": 60000,
|
||
"married": false
|
||
}
|
||
];
|
||
```
|
||
|
||
----
|
||
|
||
| | |
|
||
|---------------------|----------------------------|
|
||
| `myArray[0]` | `{`"name": "Jason", ...`}` |
|
||
| `myArray[1].name` | "Tom" |
|
||
| `myArray[1][2]` | 42 |
|
||
| `myArray[3]` | undefined |
|
||
| `myArray[3].gender` | TypeError: Cannot read... |
|
||
|
||
### 访问阵列
|
||
|
||
```javascript
|
||
let myArray = [
|
||
"Jason",
|
||
"Doe",
|
||
39,
|
||
"M",
|
||
70000,
|
||
true
|
||
];
|
||
```
|
||
|
||
----
|
||
|
||
| | |
|
||
|--------------|-----------|
|
||
| `myArray[1]` | "Doe" |
|
||
| `myArray[5]` | true |
|
||
| `myArray[6]` | undefined |
|
||
|
||
另见
|
||
----
|
||
|
||
- [JSON](https://www.json.org/json-en.html) _(json.org)_
|
||
- [JSON Editor Online](http://jsoneditoronline.org/) _(jsoneditoronline.org)_
|
||
- [Convert JSON Array to Markdown Table, CSV and more](https://tableconvert.com/json-to-markdown) _(tableconvert.com)_
|