1. Nhắc lại về JSON
JSON có nghĩa là JavaScript Object Notation. Mặc dù trong tên có từ JavaScript, định dạng này hoàn toàn ngôn ngữ-agnostic và thân thiện với hầu hết (gần như tất cả) ngôn ngữ lập trình, bao gồm cả C#. Người ta tạo ra nó để mô tả dữ liệu một cách rõ ràng và tiện lợi — objects, arrays, lists và dictionaries — dưới dạng plain text.
Trong thế giới hiện đại, nơi hầu như mọi ứng dụng đều giao tiếp với ứng dụng khác, JSON đã trở thành tiêu chuẩn de-facto cho serialization và trao đổi dữ liệu cấu trúc. Nó dùng khắp nơi: từ REST API tới lưu cấu hình người dùng và thậm chí giao tiếp nội bộ giữa microservices. Lý do thì rõ ràng — nó human-readable (nếu bạn không sợ dấu ngoặc nhọn), dễ parse và được hỗ trợ bởi mọi ngôn ngữ và thư viện hiện đại.
Tại sao không chọn XML?
JSON đơn giản hơn, ngắn gọn hơn và dễ đọc hơn XML. Thêm nữa, nó ít noise và tags, phù hợp hơn với cấu trúc dữ liệu của hầu hết ngôn ngữ lập trình. Với JSON bạn không phải lo đóng thẻ, quotes và các thủ tục XML rườm rà. Tóm lại — JSON là về nhanh hơn, đơn giản hơn, tiện hơn.
2. Các thành phần cú pháp chính của JSON
Hãy tưởng tượng JSON như một cái cây (hoặc búp bê Matryoshka), gồm objects, arrays và các dữ liệu nguyên thủy. Đây là những “viên gạch” mình có:
Objects
Object JSON là một tập các cặp "key: value", được bao quanh bởi dấu ngoặc nhọn { }.
Ví dụ:
{
"name": "Alice",
"age": 23
}
Trong C# cấu trúc này có thể biểu diễn bằng class hoặc dictionary.
Arrays
Array JSON là danh sách có thứ tự các phần tử (giá trị của mọi kiểu), đặt trong dấu ngoặc vuông [ ].
Ví dụ:
[1, 2, 3, 42]
Hoặc như này:
[
{"name": "Ivan"},
{"name": "Olga"}
]
Trong C# — đó là List<T>, T[] và các collection tương tự.
Cặp "key-value"
Key luôn luôn là string (trong dấu ngoặc kép!), còn value có thể là bất kỳ kiểu dữ liệu nào được phép trong JSON.
Ví dụ:
{
"id": 123,
"login": "student",
"isActive": true
}
Các kiểu dữ liệu trong JSON
| Kiểu JSON | Ví dụ | Mô tả |
|---|---|---|
| Số (Number) | |
Số nguyên hoặc số thực |
| Chuỗi (String) | |
Luôn ở trong dấu ngoặc kép đôi |
| Boolean | |
Giá trị luận lý |
| null | |
Không có giá trị |
| Object | |
Dictionary hoặc entity có các fields |
| Array | |
Chuỗi các giá trị |
Ví dụ — tất cả cùng lúc:
{
"id": 1,
"name": "Bob",
"scores": [10, 20, 30],
"profile": {
"email": "bob@mail.com",
"phone": null
},
"isAdmin": false
}
Bạn thấy cách mô tả một object người dùng vừa gọn vừa logic chưa.
3. Quy tắc viết JSON
Chuỗi luôn ở trong dấu ngoặc kép đôi
Dù bạn có muốn dùng single quotes thế nào, JSON sẽ không tha. Đây là đúng:
{ "name": "Vera" }
Còn đây là sai:
{ 'name': 'Vera' }
Keys — chỉ được là chuỗi
Khác với C#, nơi key của dictionary có thể là int hay enum, trong JSON key luôn là string:
{ "2025": "Nam C#", "favorite": true }
Không có trailing commas
Khác với một số cấu trúc trong C#, dấu phẩy thừa trước ngoặc đóng là lỗi cú pháp trong JSON!
// LỖI! (dấu phẩy cuối không được phép)
{
"id": 10,
"name": "Oleg",
}
Đúng phải là:
{
"id": 10,
"name": "Oleg"
}
Khoảng trắng và xuống dòng
Có thể dùng để làm đẹp, các parser sẽ bỏ qua. Thường thì để đọc được người ta dùng pretty-printed JSON, khi truyền qua mạng thì dùng minified (1 dòng, không có spaces).
4. Cách đối tượng C# chuyển thành JSON
Nếu bạn serialize một object bằng System.Text.Json.JsonSerializer.Serialize(), các fields và properties của object sẽ thành các cặp "key-value".
Ví dụ class C# và serialization
public class Book
{
public string Title { get; set; }
public int Pages { get; set; }
}
var book = new Book { Title = "CLR via C#", Pages = 900 };
string json = JsonSerializer.Serialize(book);
Console.WriteLine(json); // {"Title":"CLR via C#","Pages":900}
Collections
- List<int> trở thành [1,2,3]
- string[] trở thành ["hi", "wow"]
- List<Person> — thành mảng các object
Dictionaries
Dictionary kiểu Dictionary<string, int> sẽ chuyển thành một object:
var dict = new Dictionary<string, int>
{
["apples"] = 5, ["bananas"] = 10
};
string json = JsonSerializer.Serialize(dict);
// {"apples":5,"bananas":10}
5. Sơ đồ trực quan: JSON được xây dựng thế nào
Nesting — như Matryoshka
Object
│
├── Cặp: "name": "Alex"
├── Cặp: "hobbies": array
│ │
│ ├── "skiing"
│ └── "programming"
└── Cặp: "profile": object
│
├── "age": 42
└── "city": "Bazel"
Kết quả:
{
"name": "Alex",
"hobbies": ["skiing", "programming"],
"profile": {
"age": 42,
"city": "Bazel"
}
}
6. Lỗi thường gặp và những lưu ý về cú pháp
Trong lập trình không có thế giới hoàn hảo — ngay cả JSON cũng có bẫy! Nếu bạn cố gửi JSON với quotes sai, dấu phẩy thừa hoặc keys không được bọc quotes — parser sẽ ném lỗi.
Một “cái bẫy” nữa là số có leading zeros. Trong JSON điều này bị cấm (ví dụ 0123 — là lỗi).
Ghi nhớ: Một số parser (ví dụ JavaScript-ny JSON.parse) lỏng lẻo hơn và có thể "tha" vài lỗi nhỏ. Nhưng hầu hết parser nghiêm ngặt (ví dụ trong C# và .NET) sẽ báo lỗi ngay khi có sai sót nhỏ.
7. Ví dụ chuyển dữ liệu C# sang JSON
Thử serialize một cấu trúc phức tạp trong thực tế. Ứng dụng học của chúng ta phát triển: giả sử giờ có danh sách students và muốn lưu họ vào file JSON.
Định nghĩa class:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
Điền danh sách:
var students = new List<Student>
{
new Student { Name = "Anna", Age = 20 },
new Student { Name = "Nikita", Age = 22 }
};
Serialization:
using System.Text.Json;
// Serialize danh sách students thành chuỗi JSON
string json = JsonSerializer.Serialize(students, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
/*
[
{
"Name": "Anna",
"Age": 20
},
{
"Name": "Nikita",
"Age": 22
}
]
*/
Thấy tiện chưa? Mỗi student là một object riêng trong mảng JSON.
8. Mini-generator: cách "viết tay" JSON
Đôi khi bạn phải tự viết JSON, ví dụ tạo test data thủ công. Đây là checklist:
- Ngăn ngoài là ngoặc nhọn — cho object, ngăn ngoài là ngoặc vuông — cho array.
- Key luôn là string trong ngoặc kép đôi.
- Values — chuỗi (trong ngoặc kép đôi), số, true, false, null, object ({}), array ([]).
- Chỉ có dấu phẩy giữa phần tử, không có sau phần tử cuối!
- Indent và spaces để dễ đọc (nhưng không bắt buộc).
GO TO FULL VERSION