YAML
2 công cụ
Các Định Dạng Tuần Tự Hóa Dữ Liệu
Tuần tự hóa dữ liệu là quá trình chuyển đổi dữ liệu có cấu trúc thành một định dạng có thể lưu trữ hoặc truyền tải và sau đó khôi phục lại. Các định dạng khác nhau có những sự đánh đổi khác nhau giữa khả năng đọc của con người, khả năng phân tích của máy móc, tính biểu đạt và kích thước tệp.
JSON, YAML, TOML và XML là bốn định dạng tuần tự hóa dựa trên văn bản chiếm ưu thế trong phát triển phần mềm. Mỗi định dạng có những điểm mạnh khiến nó trở thành lựa chọn tốt nhất cho các ngữ cảnh cụ thể — hiểu rõ những sự đánh đổi đó giúp bạn chọn đúng định dạng cho từng công việc.
JSON và YAML Đặt Cạnh Nhau
JSON và YAML biểu diễn cùng một mô hình dữ liệu. YAML là tập hợp bao gồm nghiêm ngặt của JSON — bất kỳ tài liệu JSON hợp lệ nào cũng là YAML hợp lệ. Dưới đây là cùng một cấu hình được biểu diễn trong cả hai định dạng:
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
},
"database": {
"url": "postgres://localhost/mydb",
"pool": 10
}
}server: host: localhost port: 8080 debug: true database: url: postgres://localhost/mydb pool: 10
YAML sử dụng thụt lề thay vì dấu ngoặc nhọn và dấu ngoặc vuông, và bỏ qua dấu nháy đối với hầu hết các giá trị chuỗi. Điều này làm cho nó gọn gàng và dễ đọc hơn đối với các tệp do con người chỉnh sửa, nhưng lại đưa ra tính nhạy cảm với thụt lề.
So Sánh Định Dạng
| Định dạng | Khả năng đọc | Chú thích | Mảng | Tốt nhất cho |
|---|---|---|---|---|
| JSON | ★★★☆☆ | Không có chú thích | Bản địa | API, trao đổi dữ liệu |
| YAML | ★★★★★ | Có (#) | Bản địa | Tệp cấu hình, IaC |
| TOML | ★★★★☆ | Có (#) | Bản địa | Cấu hình ứng dụng (Rust, Python) |
| XML | ★★☆☆☆ | Có (<!-- -->) | Các phần tử lặp lại | Tài liệu, SOAP, SVG |
Những Điểm Bẫy Của YAML
YAML rất mạnh mẽ nhưng có những trường hợp đặc biệt nổi tiếng khiến các lập trình viên bị bất ngờ. Đây là những trường hợp phổ biến nhất:
Giá trị thuần 'NO' được hiểu là boolean false trong YAML 1.1. Các mã quốc gia như NO (Na Uy), OFF, FALSE, N đều được phân tích là false. Trong YAML 1.2 vấn đề này đã được khắc phục, nhưng nhiều bộ phân tích vẫn sử dụng quy tắc 1.1. Hãy luôn đặt dấu nháy cho các chuỗi có thể gây nhầm lẫn.
YAML sử dụng thụt lề để xác định cấu trúc. Một khoảng trắng thừa hoặc ký tự tab có thể thay đổi hoàn toàn ý nghĩa của một tài liệu. Tab bị cấm dùng làm thụt lề trong YAML — chỉ dùng khoảng trắng.
Các giá trị thuần trông giống số, boolean hoặc null sẽ tự động bị ép kiểu. '1.0' trở thành số thực, '2024-01-01' trở thành đối tượng ngày trong một số bộ phân tích. Đặt dấu nháy cho các giá trị bạn muốn giữ dưới dạng chuỗi.
Đặc tả YAML cấm rõ ràng việc sử dụng ký tự tab để thụt lề. Các trình soạn thảo tự động chuyển đổi khoảng trắng thành tab sẽ làm hỏng tệp YAML của bạn một cách thầm lặng. Hãy cấu hình trình soạn thảo của bạn để sử dụng khoảng trắng trong các tệp YAML.
YAML có hai ký hiệu chuỗi nhiều dòng: | (khối nguyên văn, giữ nguyên ký tự xuống dòng) và > (khối gấp, chuyển đổi ký tự xuống dòng thành khoảng trắng). Nhầm lẫn giữa chúng sẽ tạo ra kết quả sai một cách thầm lặng.
Các anchor (&) và alias (*) trong YAML cho phép tái sử dụng nút, điều này rất mạnh mẽ nhưng có thể tạo ra các tham chiếu vòng gây ra vòng lặp vô hạn hoặc cạn kiệt bộ nhớ trong các bộ phân tích đơn giản. Hãy xác thực YAML có anchor từ các nguồn không đáng tin cậy.
Các Tính Năng Độc Đáo Của YAML
Chú Thích
YAML hỗ trợ chú thích bằng ký tự #. Đây là một trong những lợi thế thực tế lớn nhất so với JSON đối với các tệp cấu hình — bạn có thể ghi lại các thiết lập của mình ngay trong tệp. Chú thích có thể xuất hiện trên dòng riêng hoặc sau một giá trị.
Anchor và Alias
YAML cho phép bạn định nghĩa một nút một lần với &tên-anchor và tái sử dụng nó ở bất kỳ đâu với *tên-anchor. Điều này loại bỏ sự lặp lại trong các cấu hình phức tạp. Kubernetes và Docker Compose sử dụng anchor rộng rãi cho các định nghĩa dịch vụ dùng chung.
Chuỗi Nhiều Dòng
YAML hỗ trợ các khối vô hướng với hai chế độ: khối nguyên văn (|) giữ nguyên ký tự xuống dòng chính xác như đã viết, hữu ích cho các script và template. Khối gấp (>) gói các chuỗi dài thành một dòng duy nhất, hữu ích cho các mô tả văn xuôi dài.
Khi Bạn Cần Chuyển Đổi
GitHub Actions, GitLab CI và CircleCI sử dụng YAML theo chuẩn. Khi tạo cấu hình pipeline theo chương trình, thường dễ hơn khi xây dựng một đối tượng JSON và chuyển đổi sang YAML cho đầu ra cuối cùng.
Các tài nguyên Kubernetes được định nghĩa bằng YAML, nhưng template Helm chart và một số công cụ xuất ra JSON. Chuyển đổi giữa các định dạng cho phép bạn kiểm tra các phản hồi API và sử dụng các công cụ JSON tiêu chuẩn.
Các REST API trả về JSON. Khi đưa dữ liệu đó vào các hệ thống cấu hình dựa trên YAML (Ansible, Salt, Kubernetes), một bộ chuyển đổi thu hẹp khoảng cách mà không cần định dạng lại thủ công.
Di chuyển từ công cụ này sang công cụ khác thường đồng nghĩa với việc chuyển đổi định dạng cấu hình của nó. Chuyển đổi giữa JSON và YAML cho phép bạn di chuyển giữa các hệ sinh thái (Node.js → Python, Docker → Kubernetes) một cách nhanh chóng.
Công cụ JSON Schema trưởng thành hơn YAML Schema. Một mẫu phổ biến là soạn thảo cấu hình bằng YAML để dễ đọc, chuyển đổi sang JSON để xác thực theo schema, sau đó chuyển đổi lại để triển khai.
Các công cụ nội bộ có thể sử dụng cấu hình YAML trong khi các API bên ngoài yêu cầu JSON. Một bộ chuyển đổi trong pipeline xây dựng giữ cả hai biểu diễn đồng bộ mà không cần duy trì các tệp trùng lặp.
Câu Hỏi Thường Gặp
Có. YAML 1.2 là tập hợp bao gồm nghiêm ngặt của JSON — bất kỳ tài liệu JSON hợp lệ nào cũng là YAML hợp lệ. Tuy nhiên, YAML 1.1 (vẫn được sử dụng bởi nhiều bộ phân tích) có một số trường hợp đặc biệt mà JSON hợp lệ không hợp lệ trong YAML 1.1.
YAML hỗ trợ chú thích, điều mà JSON không có. YAML cũng gọn gàng hơn đối với các cấu trúc lồng nhau sâu. Hai đặc điểm này làm cho nó trở thành lựa chọn ưa thích cho các tệp cấu hình do con người chỉnh sửa (Docker, Kubernetes, GitHub Actions).
TOML (Tom's Obvious Minimal Language) được thiết kế cho các tệp cấu hình. Nó có cú pháp rõ ràng theo kiểu INI với các kiểu dữ liệu tường minh và không có sự mơ hồ. Đây là tiêu chuẩn cho các dự án Rust (Cargo.toml) và Python (pyproject.toml).
Hiếm khi, nhưng có khả năng. JSON giữ thứ tự khóa trong hầu hết các bộ phân tích (mặc dù đặc tả nói rằng nó không có thứ tự). YAML hỗ trợ anchor và tag không có tương đương trong JSON. Để đảm bảo độ chính xác khi chuyển đổi qua lại, hãy giới hạn trong tập hợp con chung.
JSON.stringify chuyển đổi các giá trị undefined thành null trong mảng và bỏ qua chúng trong các đối tượng. Nếu bạn thấy null không mong muốn hoặc các khóa bị thiếu trong đầu ra JSON, đối tượng JavaScript nguồn có thể chứa các thuộc tính undefined.
Có. Vì YAML là tập hợp bao gồm JSON, bạn có thể nhúng cú pháp JSON trực tiếp bên trong một tài liệu YAML. Điều này đôi khi được thực hiện cho các cấu trúc lồng nhau phức tạp mà thụt lề của YAML sẽ gây nhầm lẫn.