CodeGym /课程 /C# SELF /基础 JSON 格式及其流行原因

基础 JSON 格式及其流行原因

C# SELF
第 43 级 , 课程 4
可用

1. 介绍

如果你至少打开过现代 API、使用过 web 服务、移动应用,或者只是想把东西保存成“通用格式”——你已经遇到过或会遇到 JSON。这是把不同编程语言和不同平台连接起来的那种格式:C#JavaScriptPython——大家都用 JSON 来交流。

为什么 JSON 会成为序列化的明星?答案简单:它紧凑、可读、轻量,是一种用于交换结构化数据的文本格式。它流行是因为简单、通用并且编程语言都很好支持。

什么是 JSON?

JSONJavaScript 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 示例
string
"name": "伊凡"
int, double
"score": 5
bool
"isStudent": true
数组 (int[], ...)
"scores": [5,4,5,3]
对象 (class, ...)
"contacts": { ... }
null
"phone": null

JSON 的书写规则

  1. 字符串必须用双引号:'text' — 错误,正确是 "text"
  2. 对象的键必须是双引号包裹的字符串:例如 "name": ...
  3. 逗号只出现在元素之间,最后一个元素后 不能 有尾随逗号。
  4. 缩进不是必须,但能提升可读性。
  5. 数字不加引号:"age": 25,而不是 "age": "25"
  6. 布尔值要写成 true/false(不加引号),不是 TrueFALSE"true"
  7. null 写作 null(不加引号)。

3. 作为程序员看 JSON

与 C# 类型的类比:

  • JSON 对象Dictionary<string, object>
  • JSON 数组T[]List<T>
  • JSON 字符串 ≈ 普通字符串
  • JSON 数字intdouble(取决于值)

对象序列化为 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 库:

最小的序列化/反序列化示例:

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,程序的性能可能会明显下降。

1
调查/小测验
认识序列化第 43 级,课程 4
不可用
认识序列化
数据序列化的概念
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION