JSON

JSON(JavaScript Object Notation)

JSON(JavaScript Object Notation) 是一种轻量级、文本性的数据交换格式,便于人阅读与编写,也易于机器解析和生成。尽管起源于 JavaScript 的语法子集,JSON 已成为与语言无关的通用数据格式,广泛被各种编程语言支持。


1. 简介 —— 什么是 JSON?

JSON 用键值对(key–value)来表示结构化数据,支持嵌套对象与数组,从而能够描述复杂的数据结构。它常用于前后端交互、配置文件和轻量级数据存储。


2. JSON 的主要特点

  • 可读性高:采用清晰的文本表示,结构直观。
  • 易于编写:语法简单,不需要复杂标记。
  • 易于解析:多数语言提供标准库或第三方库用于解析/生成。
  • 轻量级:相较于 XML 等格式更为紧凑,传输效率高。

3. 基本结构

JSON 有两种顶级结构:对象(Object)数组(Array)

对象(Object)

对象由若干键值对组成,使用大括号 {} 包围,键必须是字符串(双引号),值可以是字符串、数字、布尔值、null、对象或数组。

示例:

1
2
3
4
5
6
7
8
9
{
"name": "张三",
"age": 30,
"isStudent": false,
"address": {
"city": "北京",
"street": "长安街"
}
}

数组(Array)

数组由一系列值组成,使用中括号 [] 包围,元素之间用逗号分隔。数组元素类型可以混合(字符串、数字、对象等)。

示例:

1
2
3
4
5
6
7
8
9
10
11
[
"苹果",
"香蕉",
{
"name": "橙子",
"color": "橙色"
},
3.14,
true,
null
]

4. 语法规则要点

  1. 键名(Key):必须是字符串,必须用双引号 " 包围。
  2. 值(Value):可以是:
    • 字符串(双引号)
    • 数字(整数或浮点数)
    • 布尔值:true / false
    • null
    • 对象(嵌套 {}
    • 数组([]
  3. 分隔符:对象的键值对与数组元素之间用逗号 , 分隔;最后一项后不能有多余的逗号(严格 JSON 不允许尾随逗号)。
  4. 字符串转义:特殊字符需用反斜杠 \ 转义,例如:\n(换行)、\t(制表)、\"(双引号)、\\(反斜杠)等。

5. 常见用途

  • 前后端数据交换:浏览器通过 AJAX / fetch 获取后端返回的 JSON 数据,然后转换为对象进行处理。
  • 配置文件:许多工具和库使用 JSON 作为配置文件格式(可读、可编辑)。
  • 数据存储:NoSQL 数据库(如 MongoDB)使用 JSON 风格的文档存储数据。
  • 日志与接口标准:在微服务与接口设计中,JSON 常用作请求/响应的标准格式。

6. 解析与生成(示例)

不同语言通常都有内置或常用库进行 JSON 操作。

  • JavaScript

    1
    2
    const obj = JSON.parse(jsonString);      // 将 JSON 字符串解析为对象/数组
    const str = JSON.stringify(obj); // 将对象/数组转换为 JSON 字符串
  • Python

    1
    2
    3
    import json
    obj = json.loads(json_string) # 解析
    s = json.dumps(obj, ensure_ascii=False) # 生成(ensure_ascii=False 保持中文)
  • Java(示例库)

    1
    2
    3
    4
    // 使用 Gson
    Gson gson = new Gson();
    MyClass obj = gson.fromJson(jsonString, MyClass.class);
    String str = gson.toJson(obj);

7. 注意事项与最佳实践

  • 键名唯一:同一对象中不要重复使用相同键名(行为未定义或后者覆盖前者)。
  • 类型明确:注意区分字符串和数字,避免将数字写成带引号的字符串(除非确有需要)。
  • 不要有尾随逗号:严格 JSON 禁止最后一项后多余逗号,例如 { "a": 1, } 是非法的。
  • 字符编码:一般使用 UTF-8 编码,处理中文时注意编码一致性。
  • 安全性:处理来自不可信来源的 JSON 时,注意避免注入或反序列化漏洞;不要将 eval 用于解析 JSON。
  • 合理的结构设计:为接口或配置设计清晰、扁平或层次分明的结构,便于维护与演进。

8. 常见错误示例(便于排查)

  • 使用单引号代替双引号(非法):

    1
    { 'name': '张三' }   // 错误:键与字符串必须用双引号
  • 尾随逗号(非法):

    1
    { "a": 1, }         // 错误:最后不能有逗号
  • 未转义特殊字符(可能导致解析失败):

    1
    2
    { "text": "第一行
    第二行" } // 错误:换行应使用 \n 转义

9. 小结

JSON 是一种简洁、通用的数据交换格式,适合绝大多数前后端通信与轻量级数据存储场景。掌握其基本语法(字符串需双引号、无尾逗号、类型与转义)和常用解析/生成方法,可以在绝大多数开发任务中提高效率与互操作性。