CodeGym /Các khóa học /C# SELF /Những nguyên tắc cú pháp và cấu trúc cơ bản của

Những nguyên tắc cú pháp và cấu trúc cơ bản của JSON

C# SELF
Mức độ , Bài học
Có sẵn

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)
10, -5, 3.14
Số nguyên hoặc số thực
Chuỗi (String)
"hello"
Luôn ở trong dấu ngoặc kép đôi
Boolean
true, false
Giá trị luận lý
null
null
Không có giá trị
Object
{"a":1}
Dictionary hoặc entity có các fields
Array
[1,2,3]
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:

  1. Ngăn ngoài là ngoặc nhọn — cho object, ngăn ngoài là ngoặc vuông — cho array.
  2. Key luôn là string trong ngoặc kép đôi.
  3. Values — chuỗi (trong ngoặc kép đôi), số, true, false, null, object ({}), array ([]).
  4. Chỉ có dấu phẩy giữa phần tử, không có sau phần tử cuối!
  5. Indent và spaces để dễ đọc (nhưng không bắt buộc).
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION