1. 介绍
如果你至少打开过现代 API、使用过 web 服务、移动应用,或者只是想把东西保存成“通用格式”——你已经遇到过或会遇到 JSON。这是把不同编程语言和不同平台连接起来的那种格式:C#、JavaScript、Python——大家都用 JSON 来交流。
为什么 JSON 会成为序列化的明星?答案简单:它紧凑、可读、轻量,是一种用于交换结构化数据的文本格式。它流行是因为简单、通用并且编程语言都很好支持。
什么是 JSON?
JSON 是 JavaScript Object Notation 的缩写。格式起源于 JavaScript 世界,但很快跳出浏览器成为通用标准。注意:尽管名字里有 JavaScript,JSON 并不绑定于 JavaScript,所有编程语言都同样方便使用它。
这个格式在 2000 年代初由 Douglas Crockford 发明,作为比冗长的 XML 更简单的替代品。想法很直接:"JSON 更短、更简单,也更容易用眼睛读懂"。
2. JSON 格式的基本规则
关键点:JSON 是严格定义的 文本 格式,用于结构化数据。没什么魔法,只是普通文本,任何编辑器都能打开。
基础结构:
- 数组 (arrays):有序的值列表。
- 对象 (objects):键值对的集合。
- 基本类型:字符串、数字、布尔值(true, false)和特殊值 null。
最小的 JSON 文档示例:
{
"name": "伊凡",
"age": 25,
"isStudent": true,
"scores": [5, 4, 5, 3],
"contacts": {
"email": "ivan@example.com",
"phone": null
}
}
示意结构
下面是 C# 类型和 JSON 表示的简单对应表:
| C# 类型 | JSON 示例 |
|---|---|
|
|
|
|
|
|
| 数组 (int[], ...) | |
| 对象 (class, ...) | |
|
|
JSON 的书写规则
- 字符串必须用双引号:'text' — 错误,正确是 "text"。
- 对象的键必须是双引号包裹的字符串:例如 "name": ...
- 逗号只出现在元素之间,最后一个元素后 不能 有尾随逗号。
- 缩进不是必须,但能提升可读性。
- 数字不加引号:"age": 25,而不是 "age": "25"。
- 布尔值要写成 true/false(不加引号),不是 True、FALSE 或 "true"。
- null 写作 null(不加引号)。
3. 作为程序员看 JSON
与 C# 类型的类比:
- JSON 对象 ≈ Dictionary<string, object>
- JSON 数组 ≈ T[] 或 List<T>
- JSON 字符串 ≈ 普通字符串
- JSON 数字 ≈ int 或 double(取决于值)
对象序列化为 JSON 的示例
类定义:
public class Student
{
public string Name { get; set; } = "";
public int Age { get; set; }
public bool IsStudent { get; set; }
public int[] Scores { get; set; } = Array.Empty<int>();
}
生成的 JSON(简化,序列化细节后面讲):
{
"Name": "伊凡",
"Age": 25,
"IsStudent": true,
"Scores": [5, 4, 5, 3]
}
4. 合法的 JSON 结构示例
含数组和嵌套对象的对象
{
"product": "咖啡",
"price": 125.50,
"inStock": true,
"attributes": {
"weight": 500,
"unit": "克"
},
"tags": ["饮料", "能量", "arabica"],
"promotions": null
}
对象数组
[
{"id": 1, "name": "彼佳"},
{"id": 2, "name": "玛莎"},
{"id": 3, "name": "瓦西娅"}
]
5. 不合法的 JSON 示例(以及原因)
单引号:
{ 'name': '伊凡' } // 错误!
JSON 要求双引号。
最后一个元素后的逗号:
{ "x": 1, "y": 2, } // 错误!
尾随多余的逗号不允许。
注释:
{
// 可惜 JSON 不支持这种漂亮的注释
"name": "伊凡"
}
JSON 中没有注释。
6. 在真实项目中为什么需要 JSON?
系统之间的数据传输
JSON 是不同程序之间的通用“共同语言”,通常在 HTTP 上传输。例如,C# 后端和 JavaScript 前端通信时,通常用的就是 JSON。
保存配置和数据
很多应用把配置放在 .json 文件里。比如 appsettings.json 是 .NET 应用的标准。优点:容易读、改和版本控制。
服务器和移动端 API
大多数 REST API 使用 JSON 作为请求和响应格式:比如用户列表通常作为对象数组返回。
工具和库的配置
很多 .NET 工具(Serilog、Swagger 等)用 JSON 做配置。XML 越来越少见——JSON 更紧凑、更直观。
7. JSON 的流行原因:为什么大家都喜欢它?
- 可读性。 即便不是程序员也能看懂结构。
- 适合网络传输。 纯文本,体积小。
- 所有语言都支持。 序列化/反序列化都很方便。
- 适合作为配置。 各种编辑器都能很好地处理它。
- 生成简单。 生成 JSON 很容易。
- 数组、嵌套、null。 一切直观,没有像 XML 那样的“括号狂热”。
什么时候选用 JSON?
- 你在做移动或 web 应用;
- 你在和外部服务的 API 打交道;
- 你想让应用对未来集成友好。
8. C# 如何处理 JSON
简要介绍常用的 .NET 库:
- System.Text.Json — 标准、快速且简单。
- Newtonsoft.Json (Json.NET) — 功能强大的“老将”。
最小的序列化/反序列化示例:
using System.Text.Json;
// 把对象转成 JSON 字符串
var student = new Student { Name = "伊凡", Age = 25, IsStudent = true, Scores = new[] {5, 4, 5, 3} };
string json = JsonSerializer.Serialize(student);
// 反过来:从 JSON 字符串读出对象
Student? parsed = JsonSerializer.Deserialize<Student>(json);
Console.WriteLine(json);
9. 初学者处理 JSON 时常犯的错误
常见错误是把引号弄混或忘记逗号。有时候想加注释(像在 C# 里那样——确实方便!),但 JSON 不允许。
另一个常见问题是把未初始化的集合序列化了:结果会得到 "scores": null 而不是期望的数组。提前初始化集合。
记住:JSON 是文本,大数据量会占用大量内存。如果把大概 500 MB 的数据序列化为 JSON,程序的性能可能会明显下降。
GO TO FULL VERSION