Loading...

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 JSONYAML: 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: SW1 nghĩa là khóa hostname có 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úcKý hiệuMô 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: interfacedescription 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íJSONYAML
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.

So sánh cùng một dữ liệu: JSON vs YAML Sơ đồ minh họa cùng một dữ liệu cấu hình interface được biểu diễn theo hai định dạng: JSON dùng ngoặc nhọn, ngoặc vuông, dấu phẩy; YAML dùng thụt lề và dấu gạch ngang, cả hai đều dựa trên cấu trúc key-value chung. Cùng một dữ liệu, hai cách trình bày JSON và YAML đều dựa trên cấu trúc key-value Dữ liệu key-value interface, description, allowed_vlans... JSON { "interface": "Gi0/0", "enabled": true, "mode": "trunk", "allowed_vlans": [10, 20, 30] } Dùng ngoặc { } [ ] và dấu phẩy YAML interface: Gi0/0 enabled: true mode: trunk allowed_vlans: - 10 - 20 Dùng thụt lề và dấu gạch ngang 💡 Khác cú pháp trình bày, nhưng cùng một loại dữ liệu bên dưới


💬 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ọcBà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)