Kiến thức · Văn bản, dữ liệu và bảo mật
JSON, YAML hay XML: nên dùng định dạng nào?
Trả lời nhanh
JSON, YAML và XML là các định dạng văn bản cho dữ liệu có cấu trúc. JSON gọn và chặt chẽ, có sáu kiểu giá trị, và thống trị các API web. YAML dựa trên thụt lề, cho phép chú thích và được ưa chuộng cho file cấu hình. XML dùng thẻ và thuộc tính, hỗ trợ namespace và schema chính thức, và vẫn phổ biến trong tài liệu, hệ thống doanh nghiệp và feed. Cả ba đều biểu diễn được cùng một dữ liệu lồng nhau.
Mở JSON formatterCùng một dữ liệu ở ba định dạng
Một người dùng có tên, cờ đang hoạt động và hai vai trò trông như sau ở từng định dạng:
| Định dạng | Ví dụ |
|---|---|
| JSON | {"name": "Ana", "active": true, "roles": ["admin", "editor"]} |
| YAML | name: Ana / active: true / roles: [admin, editor] (mỗi khóa một dòng) |
| XML | <user active="true"><name>Ana</name><role>admin</role><role>editor</role></user> |
JSON và YAML ánh xạ trực tiếp sang object, list và giá trị đơn (scalar) trong hầu hết ngôn ngữ lập trình. XML mô tả một cây phần tử, và cách ánh xạ sang object chỉ là quy ước: ở đây cờ active có thể là thuộc tính hoặc phần tử con, và bản thân XML không cho biết giá trị đó là boolean chứ không phải văn bản true.
So sánh song song
| JSON | YAML | XML | |
|---|---|---|---|
| Đặc tả | RFC 8259, ECMA-404 | YAML 1.2.2 (2021) | W3C XML 1.0, Fifth Edition |
| Cấu trúc | Ngoặc nhọn và ngoặc vuông | Thụt lề | Thẻ mở và thẻ đóng |
| Chú thích | Không cho phép | # comment | <!-- comment --> |
| Kiểu dữ liệu có sẵn | Object, array, string, number, boolean, null | Map, sequence, scalar được suy ra kiểu | Chỉ có văn bản, trừ khi schema gán kiểu |
| Ngôn ngữ schema | JSON Schema | Thường là JSON Schema | XSD, DTD, RELAX NG |
| Tính năng thêm | Không có | Anchor và alias, nhiều tài liệu trong một file | Thuộc tính, namespace, nội dung hỗn hợp |
| Ứng dụng điển hình | API web, dữ liệu trình duyệt, log | Cấu hình: Kubernetes, pipeline CI, Docker Compose | File Office, SVG, RSS, SOAP, layout Android |
JSON: chặt chẽ và dễ đoán
Ngữ pháp của JSON nhỏ đến mức vừa một trang giấy, nên trình phân tích ở mọi ngôn ngữ đều thống nhất với nhau. Chính sự chặt chẽ đó cũng gây ra những lỗi hay gặp nhất:
- Khóa và chuỗi phải dùng dấu ngoặc kép; dấu nháy đơn là không hợp lệ.
- Không có dấu phẩy thừa sau phần tử cuối cùng của object hoặc array.
- Không có chú thích, nên cấu hình viết bằng JSON không thể tự giải thích. Các biến thể như JSONC và JSON5 có thêm chú thích nhưng không phải JSON chuẩn.
- RFC 8259 yêu cầu JSON trao đổi giữa các hệ thống phải dùng UTF-8.
Ngữ pháp không giới hạn kích thước số, nhưng RFC 8259 lưu ý rằng phần lớn phần mềm dùng số thực double IEEE 754. Trong JavaScript, số nguyên lớn hơn 9007199254740992 (2^53) bị mất độ chính xác, nên ID lớn gửi dưới dạng chuỗi sẽ an toàn hơn.
YAML: dễ đọc nhưng nhiều cạm bẫy
YAML được thiết kế để con người đọc và sửa, và YAML 1.2 gần như là tập cha của JSON, nên hầu hết file JSON cũng là YAML hợp lệ. Sự linh hoạt của nó có cái giá:
- Thụt lề chính là cấu trúc. Lệch một dấu cách là thay đổi cấp lồng nhau, và không được dùng tab để thụt lề.
- Giá trị không đặt trong ngoặc sẽ bị đoán kiểu. Theo quy tắc YAML 1.1, vẫn được nhiều trình phân tích dùng,
no,offvàyesthành boolean, nên mã quốc giaNObiến thànhfalse. Schema lõi của YAML 1.2 chỉ coitruevàfalselà boolean, nhưng hãy kiểm tra trình phân tích của bạn theo phiên bản nào. - Giá trị như
1.10có thể thành số1.1, và012có thể thành số bát phân. Hãy đặt trong ngoặc những chuỗi chỉ trông giống số, như số phiên bản và mã bưu chính.
XML: dài dòng nhưng sinh ra cho tài liệu
Với dữ liệu thuần túy, XML nặng hơn JSON, nhưng nó xử lý được những thứ hai định dạng kia không làm được: nội dung hỗn hợp (văn bản có markup xen giữa, như <p>Hello <b>world</b></p>), namespace cho phép các bộ từ vựng từ nhiều nguồn cùng tồn tại trong một file, và kiểm tra hợp lệ trưởng thành qua XSD. Các định dạng như DOCX, XLSX, SVG và RSS bên dưới đều là XML.
Chuyển XML sang JSON về bản chất là mất mát. Thuộc tính, thứ tự phần tử, phần tử lặp lại và nội dung hỗn hợp không có tương đương duy nhất trong JSON, nên các công cụ chuyển đổi phải chọn quy ước, chẳng hạn tiền tố @ cho thuộc tính hoặc ép phần tử lặp lại thành array.
Câu hỏi thường gặp
YAML có phải là tập cha của JSON không?
YAML 1.2 được sửa đổi để gần như là tập cha chặt chẽ của JSON, nên hầu hết tài liệu JSON đều phân tích được như YAML. Vẫn có vài trường hợp đặc biệt khác nhau, và trình phân tích YAML 1.1 kém tương thích hơn.
Vì sao JSON không cho phép chú thích?
Tác giả của JSON đã bỏ chú thích ra để không ai dùng chúng mang theo chỉ thị phân tích, vốn sẽ phá vỡ khả năng tương thích. Công cụ nào cần chú thích trong cấu hình thì dùng JSONC, JSON5 hoặc YAML.
JSON hay XML phân tích nhanh hơn?
Với cùng dữ liệu, JSON thường nhanh hơn và nhỏ hơn, vì ngữ pháp đơn giản hơn và không có thẻ đóng, thuộc tính hay namespace. Khác biệt chủ yếu đáng kể khi khối lượng lớn.
Chuyển YAML sang JSON có mất gì không?
Dữ liệu được giữ nguyên, nhưng chú thích, anchor và định dạng khóa thì không, vì JSON không có chỗ cho chúng. Chuyển JSON sang YAML thì không mất gì.