XML vs JSON: Hiểu Về Các Định Dạng Dữ Liệu Cho API và File Cấu Hình
So sánh XML và JSON, tìm hiểu khi nào nên dùng định dạng nào, và thành thạo các công cụ để chuyển đổi, xác thực và truy vấn dữ liệu có cấu trúc.
Mọi ứng dụng giao tiếp với thế giới bên ngoài đều trao đổi dữ liệu theo một định dạng có cấu trúc nào đó. XML thống trị trong thập niên 2000. JSON chiếm ưu thế vào thập niên 2010. Nhưng XML vẫn chưa biến mất — nó vẫn đang vận hành SOAP API, RSS feed, đồ họa SVG, giao diện Android và vô số hệ thống doanh nghiệp. Hiểu cả hai định dạng sẽ giúp bạn trở thành một lập trình viên linh hoạt hơn.
JSON tổng quan
JSON (JavaScript Object Notation) là ngôn ngữ chung của các web API hiện đại. Nó ánh xạ trực tiếp tới các kiểu dữ liệu có trong hầu hết các ngôn ngữ lập trình:
{
"user": {
"id": 42,
"name": "Alice Chen",
"roles": ["admin", "editor"],
"active": true,
"score": 98.6,
"avatar": null
}
}
Các kiểu dữ liệu: string, number, boolean, null, array, object.
JSON ngắn gọn, dễ đọc với con người và được phân tích cú pháp dễ dàng trong mọi ngôn ngữ. Đây là lựa chọn mặc định cho REST API, file cấu hình và lưu trữ trên trình duyệt.
XML tổng quan
XML (eXtensible Markup Language) biểu diễn dữ liệu dưới dạng cây các phần tử có thẻ:
<?xml version="1.0" encoding="UTF-8"?>
<user id="42">
<name>Alice Chen</name>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
<active>true</active>
<score>98.6</score>
</user>
XML dài dòng nhưng diễn đạt phong phú. Nó hỗ trợ thuộc tính (như id="42" ở trên), namespace (để kết hợp các từ vựng), comment, processing instruction và schema để xác thực nghiêm ngặt.
So sánh song song
| Tính năng | JSON | XML |
|---|---|---|
| Độ dài | Ngắn gọn | Dài dòng |
| Kiểu dữ liệu | 6 kiểu gốc | Tất cả đều là text |
| Comment | ❌ Không hỗ trợ | ✅ <!-- --> |
| Thuộc tính | ❌ Không có khái niệm | ✅ Có |
| Namespace | ❌ Không có khái niệm | ✅ Có |
| Schema | JSON Schema | XSD, DTD, RelaxNG |
| Ngôn ngữ truy vấn | JSONPath, jq | XPath, XQuery |
| XSLT transform | ❌ | ✅ |
| Khả năng đọc | Cao | Trung bình |
| Độ phức tạp khi phân tích | Thấp | Cao hơn |
Khi nào nên dùng JSON
- REST API (hầu như phổ biến hoàn toàn)
localStorage/sessionStoragecủa trình duyệt- File cấu hình (
package.json,tsconfig.json) - Cơ sở dữ liệu document NoSQL (MongoDB, Firestore)
- Giao tiếp giữa các service trong microservices
- Mọi trường hợp cần trao đổi dữ liệu nhanh và nhẹ
Khi nào nên dùng XML
- SOAP web service (tài chính, y tế, chính phủ)
- RSS và Atom feed
- Đồ họa SVG
- File tài nguyên Android (layout, string, manifest)
- Định dạng tài liệu Office (
.docx,.xlsxlà file ZIP chứa XML) - Khi cần nội dung hỗn hợp (văn bản kèm markup nội tuyến)
- Các hệ thống doanh nghiệp chưa chuyển sang JSON
Chuyển đổi giữa các định dạng
Chuyển đổi XML sang JSON hiếm khi là ánh xạ 1:1 — XML có các khái niệm (thuộc tính, text node, namespace) không tồn tại trong JSON. Các chiến lược phổ biến:
Thuộc tính trở thành property
<user id="42" active="true">Alice</user>
Có thể trở thành:
{ "@id": "42", "@active": "true", "#text": "Alice" }
Hoặc làm phẳng:
{ "id": 42, "active": true, "name": "Alice" }
Cách tiếp cận phù hợp phụ thuộc vào trường hợp sử dụng của bạn. Hãy dùng công cụ XML to JSON Converter của chúng tôi để thực hiện chuyển đổi với các tùy chọn xử lý thuộc tính.
Xác thực JSON bằng JSON Schema
JSON Schema cho phép bạn định nghĩa cấu trúc mong đợi của một tài liệu JSON:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["id", "name", "email"],
"properties": {
"id": { "type": "integer", "minimum": 1 },
"name": { "type": "string", "minLength": 1 },
"email": { "type": "string", "format": "email" },
"roles": {
"type": "array",
"items": { "type": "string" }
}
}
}
Hãy xác thực tài liệu JSON của bạn với schema bằng công cụ JSON Schema Validator — phát hiện lỗi cấu trúc trước khi đưa vào môi trường production.
JSONPath: truy vấn dữ liệu lồng nhau
JSONPath đối với JSON cũng giống như XPath đối với XML. Cú pháp truy vấn:
$.store.book[*].author — tất cả tác giả
$.store.book[0].title — tiêu đề cuốn sách đầu tiên
$.store.book[?(@.price < 10)] — sách dưới $10
$..price — tất cả giá trị price ở bất kỳ đâu
Các tương đương XPath cho XML:
/store/book/author — tất cả tác giả
/store/book[1]/title — tiêu đề cuốn sách đầu tiên
/store/book[@price < 10] — sách dưới $10
//price — tất cả giá trị price ở bất kỳ đâu
Định dạng và pretty-print
Cả hai định dạng đều trở nên khó đọc khi được rút gọn. Hãy luôn pretty-print để debug và kiểm tra thủ công.
JSON đã rút gọn:
{"user":{"id":42,"name":"Alice Chen","roles":["admin","editor"]}}
JSON pretty-print (thụt lề 2 dấu cách):
{
"user": {
"id": 42,
"name": "Alice Chen",
"roles": [
"admin",
"editor"
]
}
}
Dùng công cụ JSON Formatter của chúng tôi để pretty-print, rút gọn và xác thực JSON tức thì. Để so sánh hai đoạn JSON, JSON Diff sẽ làm nổi bật chính xác những gì đã thay đổi.
Những lỗi thường gặp
JSON
- Dấu phẩy thừa — không hợp lệ trong JSON (nhưng hợp lệ trong JavaScript)
- Dấu nháy đơn — JSON yêu cầu dấu nháy kép cho string
- Số dạng string —
"42"≠42; hãy nhất quán - Lồng nhau quá sâu — khó đọc và truy vấn; hãy làm phẳng khi có thể
XML
- Ký tự chưa escape —
<,>,&,",'phải được escape dưới dạng entity - BOM ở đầu file — một số parser gặp lỗi với UTF-8 BOM
- Nhầm lẫn namespace — dễ mắc lỗi trong tài liệu kết hợp nhiều từ vựng
Cả hai định dạng đều được hiểu rõ, có đầy đủ công cụ hỗ trợ và sẽ tiếp tục tồn tại. Biết khi nào nên dùng định dạng nào, xác thực dữ liệu của bạn, và các tích hợp của bạn sẽ đáng tin cậy hơn nhiều.