Một kỹ sư DevOps xuất cấu hình Kubernetes dạng YAML nhưng cần gửi đến API chỉ chấp nhận JSON. Một nhà phân tích nhận dữ liệu phản hồi API dạng JSON nhưng cần trong bảng tính. Một nhà khoa học dữ liệu xuất CSV từ cơ sở dữ liệu nhưng cần JSON có cấu trúc cho bảng điều khiển web.
Chuyển đổi định dạng không chỉ là thao tác cơ học. Mỗi định dạng có sự đánh đổi khác nhau, và hiểu những gì bị mất trong quá trình chuyển đổi cũng quan trọng như biết cách chuyển đổi.
Ba định dạng, ba triết lý
Mỗi định dạng được thiết kế cho đối tượng và vấn đề khác nhau:
| Định dạng | Ra đời | Thiết kế cho | Triết lý cốt lõi |
|---|---|---|---|
| CSV | ~1972 | Trao đổi dữ liệu giữa các chương trình | Đơn giản tối đa — chỉ hàng và cột |
| JSON | 2001 | Trao đổi dữ liệu web | Dữ liệu có cấu trúc dễ đọc cho máy với quy tắc nghiêm ngặt |
| YAML | 2001 | File cấu hình | Dữ liệu có cấu trúc dễ đọc cho người với cú pháp tối thiểu |
CSV giả định dữ liệu của bạn là bảng phẳng. Mọi giá trị là chuỗi. Không có khái niệm lồng nhau, kiểu dữ liệu hay metadata.
JSON giả định dữ liệu có cấu trúc — đối tượng, mảng, kiểu (chuỗi, số, boolean, null). Nó nghiêm ngặt và rõ ràng, lý tưởng cho máy nhưng dài dòng với người.
YAML giả định con người sẽ đọc và chỉnh sửa file. Nó dùng thụt lề thay vì dấu ngoặc, hỗ trợ bình luận và có cú pháp thoải mái hơn. Về mặt kỹ thuật, YAML là tập cha của JSON — bất kỳ tài liệu JSON hợp lệ nào cũng là YAML hợp lệ.
YAML là tập cha của JSON Bạn có thể dán tài liệu JSON trực tiếp vào trình phân tích YAML và nó sẽ hoạt động. Ngược lại thì không — các tính năng YAML như bình luận, anchor và chuỗi nhiều dòng không có tương đương trong JSON.
Các tình huống chuyển đổi thực tế
Di chuyển cấu hình (JSON sang YAML, YAML sang JSON)
Đây là chuyển đổi phổ biến nhất. Các công cụ khác nhau yêu cầu định dạng cấu hình khác nhau:
- Docker Compose, Kubernetes, GitHub Actions, Ansible dùng YAML
- package.json, tsconfig.json, ESLint dùng JSON
- Di chuyển giữa các công cụ thường đồng nghĩa với chuyển đổi cấu hình
Chuyển đổi này không mất dữ liệu theo cả hai chiều cho nội dung dữ liệu — nhưng bình luận YAML bị mất khi chuyển sang JSON, vì JSON không có cú pháp bình luận.
Phân tích dữ liệu (JSON sang CSV)
Phản hồi API đến dạng JSON. Nhà phân tích cần bảng tính. Chuyển đổi này hoạt động tốt cho mảng JSON phẳng — mảng các đối tượng với khóa giống nhau ánh xạ tự nhiên sang hàng và cột.
Nhưng nó gặp vấn đề với dữ liệu lồng nhau. Đối tượng JSON có trường address.city và mảng skills không có biểu diễn CSV tự nhiên. Bộ chuyển đổi phải chọn: làm phẳng khóa lồng nhau, chuyển giá trị lồng thành chuỗi, hoặc bỏ qua chúng.
Nhập dữ liệu (CSV sang JSON)
Tình huống ngược lại: nhập dữ liệu bảng tính vào ứng dụng web hoặc API. Chuyển đổi CSV sang JSON tạo mảng các đối tượng, với tiêu đề cột làm khóa. Vấn đề là CSV không có thông tin kiểu — số 42, chuỗi "42" và boolean true đều chỉ là văn bản trong CSV. Bộ chuyển đổi phải đoán kiểu.
Dễ đọc cho người (JSON sang YAML)
Đôi khi bạn chỉ cần làm file cấu hình JSON dày đặc trở nên dễ đọc. Chuyển sang YAML cho bạn thụt lề sạch và khả năng thêm bình luận để tài liệu hóa. Điều này đặc biệt có giá trị cho file cấu hình lớn mà nhóm sẽ bảo trì.
Những gì bị mất khi chuyển đổi
Đây là kiến thức quan trọng giúp tiết kiệm thời gian gỡ lỗi:
| Chuyển đổi | Mất gì |
|---|---|
| YAML sang JSON | Bình luận (JSON không có cú pháp bình luận) |
| JSON sang CSV | Lồng nhau (CSV phẳng), kiểu (mọi thứ thành văn bản), mảng |
| CSV sang JSON | Không mất gì (nhưng kiểu phải được suy luận — "42" vs 42) |
| CSV sang YAML | Không mất gì (cùng vấn đề suy luận kiểu) |
| JSON sang YAML | Không mất gì (YAML là tập cha của JSON) |
| YAML sang CSV | Bình luận, lồng nhau, kiểu, anchor/alias |
Quy luật rõ ràng: chuyển đổi sang CSV mất nhiều thông tin nhất, vì CSV là định dạng đơn giản nhất. Chuyển đổi giữa JSON và YAML gần như không mất dữ liệu. Và bình luận YAML luôn bị mất khi rời YAML.
Hai chiều vs một chiều JSON-sang-YAML và YAML-sang-JSON thực chất là hai chiều (an toàn khứ hồi, trừ bình luận). JSON-sang-CSV và YAML-sang-CSV là một chiều với dữ liệu phức tạp — bạn không thể tái tạo cấu trúc lồng từ CSV phẳng.
Cạm bẫy phổ biến khi chuyển đổi
Bẫy ép kiểu của YAML
YAML tự động diễn giải một số chuỗi thành kiểu không phải chuỗi. Từ no thành boolean false. Từ yes thành true. Chuỗi 1.0 thành số thực. Mã quốc gia như NO (Na Uy) nổi tiếng đã gây lỗi. Luôn đặt trong dấu ngoặc kép các giá trị mơ hồ trong YAML.
Nhầm lẫn dấu phân cách và mã hóa CSV
Không phải tất cả CSV đều dùng dấu phẩy. CSV châu Âu thường dùng dấu chấm phẩy (vì dấu phẩy là phân cách thập phân trong nhiều định dạng số châu Âu). Giá trị phân cách bằng tab (TSV) là biến thể khác. Và sai khác mã hóa ký tự (UTF-8 vs Latin-1) tạo ra ký tự có dấu bị lỗi.
Vấn đề dấu phẩy cuối của JSON
JSON không cho phép dấu phẩy cuối. Đây là JavaScript hợp lệ: {"a": 1, "b": 2,} — nhưng là JSON không hợp lệ. Một dấu phẩy cuối đơn lẻ gây lỗi phân tích.
Hiệu năng tập dữ liệu lớn
Với tập dữ liệu hàng triệu dòng, CSV hiệu quả hơn đáng kể so với JSON hoặc YAML. JSON thêm dấu ngoặc nhọn, dấu ngoặc vuông và dấu ngoặc kép cho mọi giá trị. CSV 1 triệu dòng có thể là 50 MB; JSON tương đương có thể là 150 MB.
Chọn đúng định dạng ngay từ đầu
Thay vì chuyển đổi sau đó, chọn đúng định dạng từ đầu tránh mất thông tin:
- Dữ liệu dạng bảng cho bảng tính hoặc cơ sở dữ liệu — CSV
- Dữ liệu có cấu trúc cho API hoặc ứng dụng web — JSON
- Cấu hình mà con người sẽ chỉnh sửa — YAML
- Dữ liệu lồng phức tạp có bình luận — YAML
- Trao đổi dữ liệu giữa các hệ thống — JSON
Tìm hiểu thêm
Chuyển đổi giữa JSON, YAML và CSV ngay lập tức với công cụ trình duyệt:
- Chuyển đổi định dạng dữ liệu — dán dữ liệu, chọn định dạng đích, tải kết quả
- JSON Formatter — xác thực, định dạng và nén JSON
- Chuyển đổi JSON sang CSV — chuyển mảng JSON thành CSV sẵn sàng cho bảng tính
- Chuyển đổi YAML-JSON — chuyển đổi giữa YAML và JSON với nhận biết bình luận
