1. 什么是 JSON(JavaScript Object Notation)?
JSON(读作“杰森”,不是按字母逐个拼读)是 JavaScript Object Notation 的缩写。尽管名字里包含“JavaScript”,JSON 是一种通用格式,几乎所有编程语言都支持,包括 Java。
JSON 由 Douglas Crockford 在 2000 年代初提出,作为在浏览器与服务器之间交换数据的简单方式。在此之前,主流是 XML——冗长且标签繁多。
JSON 更加紧凑、简单,也更易于“肉眼”阅读。它迅速成为客户端与服务器之间数据交换的事实标准,尤其是在 Web 与移动应用中。
为什么 JSON 成为标准?
- 语法简单——手写、阅读都很容易。
- 紧凑——没有多余的标签和“废话”。
- 可读性强——即使非技术人士也能看懂。
- 易于解析——大多数语言都有内置/第三方库。
- 跨语言——Java、Python、Kotlin 等等——都支持 JSON。
- REST API 的事实标准——绝大多数 API 返回 JSON。
与 XML 的比较
| JSON | XML | |
|---|---|---|
| 可读性 | 非常高 | 中等(标签很多) |
| 体积 | 紧凑 | 更臃肿 |
| 解析 | 简单 | 更费力 |
| 可扩展性 | 支持嵌套 | 支持嵌套 |
| 严格性 | 不太严格 | 可定义 schema |
| 流行度(2020+) | 非常高 | 仍在使用,但更少 |
JSON 在几乎所有方面都占优。尽管如此,在需要复杂 schema、严格类型、基于 XSD 的校验、支持注释与属性的场景——例如在遗留系统与银行业软件中——XML 仍然有其用武之地。
在实践中,如果你不是在为银行或航天器编写软件——就用 JSON。
2. JSON 的基础语法
如果你用过 JavaScript 的object或其他语言的字典,语法会觉得很熟悉。在 Java 中没有直接的“字典”,其角色由 java.util 中的集合承担,首选 Map<K, V>(通常是 HashMap<K, V>)。
基本元素
- object——由若干“key: value”对组成,用 { } 包裹。
- array——有序的value列表,用 [ ] 包裹。
object示例:
{
"name": "Alice",
"age": 25
}
array示例:
[1, 2, 3, 4, 5]
包含array的object示例:
{
"students": [
"Ivan",
"Maria",
"John"
]
}
允许的value类型
JSON 只支持以下数据类型:
| 类型 | 示例 | 说明 |
|---|---|---|
| 字符串 | |
始终使用双引号 |
| 数字 | |
整数与小数 |
| 布尔 | |
布尔value |
| null | |
空,表示没有value |
| object | |
若干“key: value”对的集合 |
| array | |
value的列表 |
注意:object中的key必须是使用双引号的字符串,例如 "name"。不允许使用单引号。
有效 JSON 示例
{
"id": 1,
"name": "Bob",
"active": true,
"scores": [10, 20, 30],
"profile": {
"email": "bob@example.com",
"phone": null
}
}
无效的 JSON 示例(错误)
{
name: 'Bob', // 错误:key和value必须使用双引号!
age: 25,
}
3. 数据结构:object与array的嵌套
JSON 支持深度嵌套:object中可以有object、object中可以有array、array中可以有object,等等,就像套娃。
复杂 JSON 文档示例
{
"university": "Java University",
"students": [
{
"name": "Ivan",
"age": 20,
"courses": ["Math", "Java", "English"]
},
{
"name": "Maria",
"age": 19,
"courses": ["Biology", "Java", "Art"]
}
],
"active": true
}
在根object中有一个字符串字段 "university",一个布尔字段 "active",以及一个array "students",其中存放学生object。
可视化示意(方框图)
{
"key": value,
"array": [
{ "key": value },
{ "key": value }
],
"object": {
"key": value
}
}
4. JSON 的优势
为什么 JSON 如此流行?
- 对人和机器都易读——结构一目了然。
- 紧凑——冗余符号最少。
- 易于解析——读写库非常多。
- REST API 与移动应用的事实标准——无处不在。
- 灵活——既能表示简单列表,也能表示树形结构。
- 配置、设置、数据存储——常用于各类配置。
- 语言全面支持——Java、Python、Go、Rust 等。
5. 实践:解析 JSON 文件示例
示例 1:用户列表
[
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
}
]
这是一个array,其中每个元素都是一个用户object。
示例 2:应用配置
{
"debug": true,
"maxConnections": 100,
"database": {
"host": "localhost",
"port": 5432,
"user": "admin",
"password": "password"
}
}
该object包含一个嵌套object "database"。这与真实的应用配置非常相似。
示例 3:JSON 中的错误
{
"name": "Alice",
"age": 25,
} // 错误:闭合括号前多了一个逗号!
请记住:在 JSON 中,最后一个元素后不能加逗号。
示例 4:未加引号的key
{ name: "Alice", age: 25 } // 错误:key必须使用双引号!
6. 实用细节
表格:JSON 中哪些可以,哪些不可以
| 可以 | 不可以 |
|---|---|
|
|
|
|
|
|
|
|
|
|
JSON 与 Java object的简要对照
| Java | JSON |
|---|---|
|
数字,true/false |
|
"字符串" |
| List<T>, array | [value1, value2, ...] |
|
{ "key": value, ... } |
|
null |
| 带字段的类 | { "字段": value, ... } |
示例:Java 类及其 JSON 表示
public class Student {
public String name;
public int age;
}
{
"name": "Alice",
"age": 20
}
7. 使用 JSON 常见错误
错误 1:用单引号代替双引号。JSON 只接受用于key和字符串的双引号。
{ 'name': 'Alice' } // 错误!
错误 2:多余的逗号。不允许在最后一个元素后添加逗号。
{ "name": "Alice", } // 错误!
错误 3:key未加引号。key必须始终用双引号括起来。
{ name: "Alice" } // 错误!
错误 4:带前导零的数字。这类数字是无效的。
{ "age": 025 } // 错误!
错误 5:使用 undefined。JSON 中没有 undefined,请使用 null。
{ "value": undefined } // 错误!
错误 6:True/False 首字母大写。JSON 只有小写的 true 与 false。
{ "active": True } // 错误!
GO TO FULL VERSION