## 入门

### 介绍

JSON 是一种基于文本的轻量级开放标准，专为人类可读的数据交换而设计。

- JSON 代表 JavaScript 对象表示法
- JSON 易于读写。
- JSON 是与语言无关的数据交换格式
- JSON 文件扩展名为 `.json`
- JSON Internet 媒体类型为 `application/json`

### 示例

    {
      "name": "Jason",
      "age": 39,
      "height": 1.92,
      "gender": "M",
      "salary": 70000,
      "married": true,
      "children": [
        {"name": "Tom", "age": 9, "gender":"M"},
        {"name": "Ava", "age": 7, "gender":"F"}
      ]
    }

### 类型

类型 | 描述
--- | ---
`Number` | 双精度浮点
`String` | 字符系列
`Boolean` | “true”或“false”
`Array` | 有序的值序列
`Value` | 字符串、数字、布尔值、空值等
`Object` | 键/值对的无序集合
`null` | Null 或 Empty

### 字符串

`\"` | 双引号 Double quote
`\\` | 反斜杠 Backslash
`\/` | 正斜杠 Forward slash
`\b` | 退格 Backspace
`\f` | 换页 Form feed
`\n` | 换行 Newline
`\r` | 回车 Carriage return
`\t` | 标签 Tab
`\u` | 后跟四个十六进制数字

#### 示例

    {
      "url": "https://quickref.me",
      "msg" : "Hi,\n\"QuickRef.ME\"",
      "intro": "Share quick reference and cheat sheet for developers."
    }

#### 无效字符串

    { "foo": 'bar' }

Have to be delimited by double quotes

### 数字

类型 | 说明
--- | ---
`Integer` | 数字 1-9、0 和正数或负数
`Fraction` | 0.3、3.9 等分数
`Exponent` | 指数，如 e、e+、e-、E、E+、E

#### 示例

    {
      "positive" : 12,
      "negative" : -1,
      "fraction" : 10.25,
      "exponent" : 1.0E+2,
      "zero" : 0
    }

#### 无效的数字

    { "foo": 0xFF }

在JSON中，只能使用十进制文字

### 对象 Objects

    {
      "color": "Purple",
      "id": "210",
      "composition": {
        "R": 70,
        "G": 39,
        "B": 89
      },
      "empty_object": {}
    }

用逗号分隔的多个键/值对

### 数组 Arrays

    [1, 2, 3, 4, 5]

以 `[` 开始并以 `]` 结束

### 对象数组

    {
      "children": [
        { "name": "Jimmy Smith", "age": 15 },
        { "name": "Sammy Sosa", "age": 12 }
      ]
    }

### 数组对象

    {
      "attributes": ["a1", "a2"],
      "methods": ["getter", "setter"],
      "empty_array": []
    }

### 二维阵列

    {
      "my_sequences": [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9, 0],
        [10, 11]
      ]
    }

### 对象的对象

    {
      "Mark McGwire": {
        "hr": 65,
        "avg": 0.278
      },
      "Sammy Sosa": {
        "hr": 63,
        "avg": 0.288
      }
    }

### 嵌套

    {
      "Jack": {
        "id": 1,
        "name": "Franc",
        "salary": 25000,
        "hobby": ["a", "b"],
        "location": {
            "country": "A", "city": "A-A"
        }
      }
    }

## 在 JavaScript 中访问 JSON

### 访问对象

    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

### 访问嵌套

    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

### 访问对象数组

    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...

### 访问阵列

    let myArray = [
      "Jason",
      "Doe",
      39,
      "M",
      70000,
      true
    ];

`myArray[1]` | "Doe"
`myArray[5]` | true
`myArray[6]` | undefined

## 另见

- JSON (json.org)
- JSON Editor Online (jsoneditoronline.org)
- Convert JSON Array to Markdown Table, CSV and more (tableconvert.com)