Danh mục sản phẩm
Bài 91: JSON & YAML — định dạng dữ liệu dùng trong automation
💡 Liên hệ thực tế
Ở Bài 90, khi DNA Center trả lời request REST API, dữ liệu trả về không phải là một đoạn văn bản tự do như output lệnh show trên CLI — nó phải theo một khuôn dạng chuẩn mà bất kỳ chương trình nào, viết bằng bất kỳ ngôn ngữ lập trình nào, cũng đọc hiểu được giống nhau.
Anh Nam và chị Lan nói chuyện được với nhau vì cùng dùng tiếng Việt có cấu trúc ngữ pháp chung. Hai phần mềm cũng cần một "ngôn ngữ chung" như vậy để trao đổi dữ liệu có cấu trúc — đó chính là vai trò của JSON và YAML: không phải ngôn ngữ lập trình, mà là định dạng dữ liệu (data format) giúp mọi hệ thống — dù viết bằng Python, Java hay bất kỳ ngôn ngữ nào — đều hiểu đúng cùng một dữ liệu theo cùng một cách.
📘 Kiến thức cốt lõi
1. Vì sao cần định dạng dữ liệu chuẩn hóa
Mỗi ngôn ngữ lập trình lưu trữ biến, danh sách, đối tượng theo cách riêng của mình. Khi hai chương trình khác ngôn ngữ cần trao đổi dữ liệu — ví dụ script Python gọi REST API của DNA Center (viết bằng ngôn ngữ khác) — cả hai cần một định dạng trung gian chung mà cả hai bên đều hiểu giống nhau. Định dạng trung gian đó gọi là data serialization format (định dạng tuần tự hóa dữ liệu), phổ biến nhất trong network automation là JSON, YAML, và (ít phổ biến hơn ở các hệ thống mới) XML.
🎯 Điểm chung cốt lõi của JSON và YAML: cả hai đều biểu diễn dữ liệu dưới dạng key-value (cặp khóa-giá trị) — ví dụ
hostname: SW1nghĩa là khóahostnamecó giá trịSW1. Đây là khái niệm nền tảng xuyên suốt toàn bộ automation, dù dùng JSON, YAML hay bất kỳ định dạng nào khác.
2. JSON — JavaScript Object Notation
JSON biểu diễn dữ liệu bằng 2 cấu trúc chính:
| Cấu trúc | Ký hiệu | Mô tả |
|---|---|---|
| Object | { } |
Một tập hợp các cặp "key": value, phân tách nhau bằng dấu phẩy, đặt trong cặp ngoặc nhọn |
| Array | [ ] |
Một danh sách các giá trị (không phải cặp key-value), phân tách nhau bằng dấu phẩy, đặt trong cặp ngoặc vuông |
Quy tắc cú pháp cần nhớ:
- Khóa (key) luôn là chuỗi ký tự, đặt trong dấu ngoặc kép
" ". - Khóa và giá trị cách nhau bằng dấu hai chấm
:. - Giá trị dạng chuỗi cũng đặt trong ngoặc kép; giá trị dạng số thì không.
- Các cặp key-value hoặc các phần tử trong array phân tách nhau bằng dấu phẩy
,.
Ví dụ 1 object JSON mô tả cấu hình interface:
json
{
"interface": "GigabitEthernet0/0",
"description": "Link to Core Switch",
"enabled": true,
"mode": "trunk",
"allowed_vlans": [10, 20, 30]
}
Giải thích: đây là 1 object chứa 5 cặp key-value: interface và description có giá trị dạng chuỗi (trong ngoặc kép), enabled có giá trị boolean (true/false, không có ngoặc kép), mode xác định cổng đang ở chế độ trunk (chỉ cổng trunk mới cho phép nhiều VLAN đi qua cùng lúc), còn allowed_vlans có giá trị là 1 array chứa 3 số nguyên — minh họa đúng 2 cấu trúc object và array vừa nêu ở bảng trên.
3. YAML — YAML Ain't Markup Language
YAML biểu diễn cùng loại dữ liệu như JSON nhưng ưu tiên dễ đọc cho con người: bỏ dấu ngoặc kép, dấu ngoặc nhọn/vuông, dấu phẩy, thay vào đó dùng thụt lề (indentation) và dấu gạch ngang để thể hiện cấu trúc.
Quy tắc cú pháp cần nhớ:
- Cặp key-value cách nhau bằng dấu hai chấm
:và một khoảng trắng, không cần ngoặc kép quanh khóa hay giá trị chuỗi. - Cấu trúc lồng nhau (nested) được thể hiện bằng thụt lề — thụt vào càng sâu, cấp lồng nhau càng sâu. Thụt lề trong YAML dùng dấu cách (space), không dùng ký tự Tab.
- Mỗi phần tử trong 1 danh sách (list) được đánh dấu bằng dấu gạch ngang
-ở đầu dòng.
Cùng dữ liệu ở ví dụ JSON trên, viết lại bằng YAML:
yaml
interface: GigabitEthernet0/0 description: Link to Core Switch enabled: true mode: trunk allowed_vlans: - 10 - 20 - 30
Giải thích: interface, description, enabled, mode là các cặp key-value viết trực tiếp, không ngoặc kép; allowed_vlans là 1 danh sách (list) gồm 3 phần tử, mỗi phần tử đứng trên 1 dòng riêng, đánh dấu bằng dấu - và thụt lề vào so với khóa allowed_vlans:. Đây chính xác là cùng một dữ liệu như ví dụ JSON ở mục 2 — chỉ khác cách trình bày.
📎 YAML chính là định dạng dùng cho playbook Ansible đã học ở Bài 87 — lúc đó khối
hosts:,tasks:,lines:chính là các cặp key-value và list theo đúng cú pháp YAML vừa học ở đây.
4. So sánh nhanh JSON và YAML
| Tiêu chí | JSON | YAML |
|---|---|---|
| Cấu trúc lồng nhau | Dấu ngoặc { } [ ] |
Thụt lề (indentation) |
| Khóa/chuỗi | Bắt buộc trong ngoặc kép " " |
Không cần ngoặc kép |
| Phân tách phần tử | Dấu phẩy , |
Xuống dòng, dùng dấu - cho danh sách |
| Độ dễ đọc với con người | Trung bình, rườm rà hơn khi dữ liệu lồng sâu | Cao, gần với ngôn ngữ tự nhiên |
| Nơi thường gặp trong automation | Phản hồi (response) của REST API | Playbook Ansible, file cấu hình |
⚠️ JSON và YAML biểu diễn cùng một loại dữ liệu cốt lõi (key-value, object, list) — khác nhau chủ yếu ở cú pháp trình bày. Vì thụt lề trong YAML mang ý nghĩa cấu trúc (không chỉ để đẹp mắt), gõ sai số khoảng trắng thụt lề là lỗi phổ biến nhất khi viết tay YAML, có thể khiến toàn bộ file bị hiểu sai cấu trúc.
💬 Hỏi & Đáp nhanh
❓ Trong YAML, có bắt buộc dùng dấu ngoặc kép quanh giá trị chuỗi như JSON không?
✅ Không bắt buộc — YAML thường không cần ngoặc kép quanh chuỗi (trừ một số trường hợp chuỗi chứa ký tự đặc biệt cần làm rõ ranh giới). Đây là khác biệt cú pháp lớn nhất dễ nhận ra khi so với JSON.
❓ Nếu gõ sai số khoảng trắng thụt lề trong YAML thì điều gì xảy ra?
✅ File YAML có thể bị hiểu sai cấu trúc lồng nhau — ví dụ một khóa lẽ ra thuộc cấp con của khóa khác lại bị hiểu thành cấp ngang hàng, khiến chương trình đọc file (ví dụ Ansible) xử lý sai hoặc báo lỗi cú pháp.
❓ Ansible playbook đã học ở Bài 87 dùng định dạng nào?
✅ YAML — các khối hosts:, tasks:, lines: trong playbook chính là cú pháp key-value và list của YAML đã học ở bài này.
📝 Bài tập đánh giá
Câu 1: Trong cú pháp JSON, cấu trúc nào dùng để biểu diễn một danh sách các giá trị (không phải cặp key-value)?
- A. Object, đặt trong dấu ngoặc nhọn
{ } - B. Array, đặt trong dấu ngoặc vuông
[ ] - C. Key-value, phân tách bằng dấu hai chấm
- D. Comment, bắt đầu bằng dấu
#
Câu 2: Đặc điểm cú pháp nào sau đây là đúng với YAML?
- A. Bắt buộc dùng dấu ngoặc kép quanh mọi khóa và giá trị chuỗi
- B. Dùng dấu phẩy để phân tách các cặp key-value
- C. Dùng thụt lề để thể hiện cấu trúc lồng nhau, và dấu gạch ngang cho từng phần tử trong danh sách
- D. Không thể biểu diễn danh sách (list), chỉ biểu diễn được key-value đơn
👉 Đáp án
Câu 1: B — Array trong JSON dùng dấu ngoặc vuông [ ] để chứa một danh sách các giá trị; Object (dùng { }) mới là cấu trúc chứa các cặp key-value.
Câu 2: C — YAML dùng thụt lề (indentation) để thể hiện cấp độ lồng nhau và dấu gạch ngang - để đánh dấu từng phần tử trong danh sách, khác với JSON vốn dùng ngoặc và dấu phẩy; YAML không bắt buộc ngoặc kép và hoàn toàn có thể biểu diễn list.
📚 Bài viết thuộc khóa học CCNA của VNExperts
🧭 Điều hướng
| ⬅️ Bài trước | 🏠 Mục lục khóa học | Bài kế tiếp ➡️ |
|---|---|---|
| Bài 90: REST API cơ bản — cách network device "nói chuyện" qua API | Mục lục khóa học CCNA | Bài 92: Giới thiệu Ansible & Terraform trong quản lý hạ tầng mạng (mức nhận biết) |
