design

JSON vs YAML vs TOML: Khi Nào Nên Chọn Định Dạng Nào (Cẩm Nang Quyết Định cho Developer)

So sánh JSON vs YAML vs TOML: Chọn JSON cho API và data, YAML cho config Kubernetes/CI (cẩn thận 'Norway problem'), TOML cho config tường minh như Cargo.toml. Cẩm nang quyết định rõ ràng.

Published 2026-06-16 · 9 min read

Affiliate disclosure

Some links below are affiliate links. I may earn a commission from qualifying purchases at no extra cost to you. I only recommend tools I have used or tested.

Laptop mở code và cây cảnh nhỏ trong quán cà phê
Photo by James Harrison on Unsplash

Bạn đang phân vân chọn định dạng config hoặc dữ liệu, và sự lựa chọn này quan trọng. JSON, YAML, và TOML giải quyết cùng một vấn đề theo các cách khác nhau, và nếu chọn sai bạn sẽ rước thêm ma sát, bug, hoặc đau đầu khi bảo trì. Hãy cứ thẳng vào vấn đề và xây dựng một sơ đồ quyết định rõ ràng nhé.

TL;DR

  • JSON: trao đổi dữ liệu và API — phổ biến nhưng cứng nhắc, không có comment.
  • YAML: tiêu chuẩn config do con người đọc (Kubernetes, GitHub Actions, Docker Compose) — dễ đọc nhưng mong manh (vấn đề Norway, khoảng trắng). Nhớ bọc nháy chuỗi của bạn.
  • TOML: config tường minh, hỗ trợ comment tốt (Cargo.toml, pyproject.toml) — tuyệt vời cho cấu trúc phẳng hoặc lồng nhau nông, nhưng dài dòng nếu cấu trúc quá sâu.

JSON, YAML và TOML thực chất là gì?

JSON là một định dạng văn bản dùng để trao đổi dữ liệu có cấu trúc giữa các hệ thống. Nót rất khắt khe: ngoặc nhọn, key phải bọc nháy, không comment. Nó được thiết kế ưu tiên máy đọc trước, con người đọc sau. RFC 8259 khóa cứng đặc tả này, nên mọi ngôn ngữ đều phân tích cú pháp nó theo cùng một cách.

YAML là một ngôn ngữ config kiêm luôn định dạng tuần tự hóa (serialization). Mục tiêu của nó là khả năng đọc của con người: không cần bọc nháy hầu hết các chuỗi, thụt lề thay thế cho ngoặc, và nó là một siêu tập (superset) của JSON. Red Hat gọi nó là tiêu chuẩn cho tự động hóa — Kubernetes, Ansible, GitHub Actions, và Docker Compose đều nói ngôn ngữ YAML.

TOML là viết tắt của Tom's Obvious, Minimal Language. Nó minh bạch về cấu trúc: bạn khai báo các phần bằng dấu ngoặc vuông, các key luôn hiển thị rõ ràng và comment là công dân hạng nhất. TOML.io định vị nó như một giải pháp thay thế tối giản cho YAML trong các file config — và nó được tích hợp sẵn vào Rust (Cargo.toml) cũng như Python 3.11+.

Vấn đề không phải là cái nào xuất sắc nhất. Mà là cái nào phù hợp với trường hợp sử dụng của bạn. Hãy thử ném một đoạn code mẫu vào bộ chuyển đổi JSON↔YAML↔TOML của chúng tôi để xem cùng một dữ liệu được biểu diễn thế nào dưới cả ba góc độ.

Khi nào nên chọn JSON?

Hãy chọn JSON khi các hệ thống trao đổi dữ liệu và con người không cần tự tay chỉnh sửa file. JSON là ngôn ngữ chung của thế giới web: API trả về nó, log dùng nó, các công cụ chấp nhận nó. Mọi ngôn ngữ đều có parser, và tất cả đều xử lý y hệt nhau, nên bạn sẽ không bị giật mình bởi sự dị biệt của parser này so với parser khác.

Đánh đổi ở đây là JSON khá dài dòng đối với con người. Không có comment bởi vì đặc tả cấm điều đó. Bắt buộc bọc nháy mọi key. Từ chối dấu phẩy cuối cùng. Tự tay chỉnh sửa config bằng JSON đúng là một cơn ác mộng. Hãy dùng nó cho API, xuất dữ liệu giữa các công cụ và log do máy tạo ra — chớ đừng dùng làm file config để duy trì.

Khi nào nên chọn YAML?

Hãy chọn YAML khi con người thường xuyên sửa config và bạn muốn cú pháp tối giản nhất. Nó là tiêu chuẩn trên thực tế cho Kubernetes manifests, GitHub Actions, Docker Compose và Ansible. Chuỗi không cần bọc nháy, thụt lề định hình cấu trúc, và nó đọc giống như code giả (pseudo-code) vậy.

database:
  host: localhost
  port: 5432
  user: admin

Nhìn qua nhanh hơn nhiều so với JSON tương đương đúng không? Nhưng sự dễ đọc luôn đi kèm với cái giá, và cái giá đó có tên.

Những cái bẫy YAML mà dev nào cũng cần biết

Vấn đề Norway (Na Uy) là cú lừa nổi tiếng nhất. Trong YAML 1.1 — vốn vẫn là mặc định ở PyYAML và một số parser, các từ không bọc nháy như yes, no, onoff sẽ bị phân tích thành boolean chứ không phải chuỗi như tác giả StrictYAML đã chỉ ra.

country_code: NO
enabled: yes

Sẽ bị phân tích thành country_code: false, enabled: true. Mã quốc gia của Na Uy NO lặng lẽ biến thành boolean false. Không có bất kỳ lỗi cú pháp nào báo về — chỉ là một giá trị sai bét. Cách khắc phục là bọc nó lại: country_code: "NO".

Khoảng trắng cũng là thứ thiêng liêng. YAML cấm dùng phím Tab, thụt lề 2 khoảng trắng là chuẩn mực, và chỉ một dòng lệch đi một chút cũng sẽ bị dịch sai bét mà không báo lỗi. Một ký tự Tab vô tình dán từ trình soạn thảo rich-text có thể làm hỏng toàn bộ file. Bài học rút ra: YAML thân thiện với con người nếu bạn kỷ luật — bọc nháy các chuỗi dễ nhầm lẫn, chạy linter và xác thực bằng trình định dạng YAML của chúng tôi trước khi đưa lên production.

Khi nào nên chọn TOML?

Hãy chọn TOML khi bạn muốn cấu trúc tường minh và khả năng comment thực sự. Nó map trực tiếp vào một hash table, các phần được khai báo rõ ràng, và comment là một phần của ngôn ngữ. Đây là tiêu chuẩn cho Cargo.toml của Rust và pyproject.toml của Python.

[database]
host = "localhost"
port = 5432  # Ở đây comment là công dân hạng nhất nhé

Nhược điểm duy nhất là sự dài dòng khi cấu trúc lồng vào nhau quá sâu. Ở mức lồng thứ ba, TOML sẽ phải lặp lại toàn bộ đường dẫn của section ([servers.alpha.ports]) trong khi YAML chỉ cần thụt lề thêm một chút. Hãy dùng TOML cho các config phẳng hoặc nông; và quay sang YAML khi "cái cây" bắt đầu rễ sâu.

Bảng quyết định

Định dạngPhù hợp nhất choTránh khiThực tế ai đang dùng
JSONAPI, trao đổi dữ liệu, logCon người tự sửa, cần commentPhản hồi API, package.json
YAMLKubernetes, CI/CD, config người đọcCần kiểm tra kiểu gắt gao, yêu cầu khắt kheGitHub Actions, Docker Compose
TOMLConfig ứng dụng, dự án Rust/PythonCấu hình lồng sâu phức tạpCargo.toml, pyproject.toml

Hãy định dạng JSON của bạn trước bằng trình định dạng JSON của chúng tôi, sau đó chuyển đổi qua lại giữa cả ba loại để so sánh cấu trúc của chúng.

Làm thế nào để chuyển đổi giữa JSON, YAML và TOML?

Hầu hết thời gian, bạn sẽ không tự viết lại bằng tay đâu, mà là dùng công cụ chuyển đổi. Bởi vì YAML 1.2 là một siêu tập của JSON và cả ba đều mô tả chung một kiểu cấu trúc key-value lồng nhau, nên các công cụ có thể dịch chúng một cách cơ học. Điều này cực kỳ hữu ích khi bạn được giao sẵn một file config bằng YAML nhưng muốn xem nó trông như thế nào dưới dạng TOML, hoặc khi API ném cho bạn JSON và bạn muốn một phiên bản dễ đọc hơn để ngâm cứu.

Vài quy tắc sẽ sống sót qua mọi lần chuyển đổi, và vài thứ thì không. Key, value, số liệu, và các cấp bậc lồng nhau sẽ được giữ nguyên hoàn hảo. Còn comment thì không: JSON không có chỗ để chứa chúng, nên việc chuyển đổi một file TOML hay YAML có chứa comment sang JSON sẽ đánh rơi hết mọi ghi chú. Kiểu dữ liệu cũng có thể bị biến đổi, và đây chính là chỗ cái bẫy Norway cắn bạn. Chuyển country_code: NO từ YAML 1.1 sang JSON, bạn có thể sẽ nhận về false thay vì "NO".

Quy trình an toàn là: chuyển đổi xong, hãy đọc lướt lại kết quả trước khi commit. Dán file của bạn vào bộ chuyển đổi JSON↔YAML↔TOML, kiểm tra xem chuỗi có còn là chuỗi không và có gì quan trọng biến mất không, rồi mới lưu vào dự án. Để rà soát nhanh cho một file đơn lẻ, JSON formatter sẽ đánh dấu các lỗi cấu trúc trước khi chúng kịp ngấm vào bản build của bạn.

Những định dạng này có xử lý ngày tháng và số liệu giống nhau không?

Không đâu, và khoảng cách này quyết định nhiều file config hơn bạn tưởng. JSON giữ hệ thống kiểu dữ liệu của nó cố tình thu nhỏ lại. Nó có chuỗi, số, boolean, null, mảng, và object, và không có gì khác trong đặc tả. Nó không có kiểu dữ liệu ngày tháng hay thời gian gốc, vì vậy một dấu thời gian (timestamp) trong JSON thực ra chỉ là một chuỗi mà code của bạn phải tự phân tích và tin tưởng nó đúng.

TOML thì đi theo hướng ngược lại. Nó có các kiểu ngày và giờ được tích hợp sẵn ở cấp độ đầu tiên, vì vậy một timestamp có múi giờ hoặc một ngày cụ thể sẽ là một giá trị thực sự được xác thực, thay vì một chuỗi mà bạn cứ thấp thỏm hy vọng là nó định dạng đúng. Điều này khiến TOML trở nên rất thú vị để làm config ghi lại các lịch trình, phiên bản hoặc ngày phát hành. YAML nằm ở giữa, với việc xử lý ngày tháng tùy chọn phụ thuộc vào từng parser và phiên bản.

Bài học mang tính thực tiễn là: Nếu config của bạn có dựa dẫm vào các ngày tháng thực tế và bạn muốn định danh đó xác thực chúng giúp bạn, TOML sẽ giúp bạn tiết kiệm được một bước parse dữ liệu. Nếu bạn chỉ trao đổi dữ liệu với các hệ thống khác và tự xử lý kiểu dữ liệu trong code thôi, thì bộ kiểu dữ liệu siêu nhỏ của JSON lại là một điểm cộng chứ không phải giới hạn.

XML và INI thì sao?

Chúng vẫn tồn tại, và đôi khi lại là lựa chọn đúng đắn. XML là "ông nội" dài dòng của gia đình này. Nó rất khắt khe, thân thiện với lược đồ (schema) và vẫn là tiêu chuẩn trong các hệ thống doanh nghiệp, SOAP API và các định dạng tài liệu như .docx. Cái giá phải trả là cú pháp nặng nề: mỗi giá trị đều kẹp giữa thẻ mở và thẻ đóng, khiến file XML dài gấp hai đến ba lần so với JSON tương đương. Chỉ nên dùng khi một hệ thống hoặc tiêu chuẩn bắt buộc phải có nó.

INI thì ngược lại, là một định dạng cổ kính, siêu nhỏ gọn với các dòng key = value gom nhóm dưới [sections]. Nó cực kỳ đơn giản và vẫn phổ biến trong các ứng dụng desktop cũ hoặc một số công cụ. Vấn đề là INI chưa bao giờ được tiêu chuẩn hóa chính thức, nên hai parser có thể sẽ không đồng ý với nhau về cách lồng cấu trúc, phân loại kiểu dữ liệu hay comment. Thật ra thì, bạn nên hiểu TOML chính là một bản INI có đặc tả chuẩn và quy tắc rõ ràng, đó là lý do tại sao các dự án mới gần như luôn chọn TOML thay vì INI.

Đối với mọi dự án mới, ba định dạng hiện đại này đã bao trùm hết mọi nhu cầu rồi. Chỉ cần nhớ XML và INI khi bạn làm việc bên trong một hệ thống đã quen dùng chúng mà thôi.

Tóm lại

Máy móc trao đổi dữ liệu thì dùng JSON. Con người sửa các config nông thì dùng TOML. Hệ sinh thái như Kubernetes và CI/CD thì dùng YAML — nhớ bọc nháy chuỗi và lint gắt gao là được. Định dạng tốt nhất thường là cái mà tech stack của bạn đang dùng; cố đấu tranh lại cả một hệ sinh thái thì đúng là một cuộc chơi thua cuộc.

Tóm lại: Máy móc trao đổi dữ liệu → JSON. Con người sửa config nông → TOML. Kubernetes / CI/CD → YAML (nhớ bọc nháy chuỗi nhé). Vấn đề Norway sẽ mắc bạn đúng một lần; sau đó, bạn sẽ tự động bọc nhạy các chuỗi của mình thôi.

Đọc tiếp


“Nói suông thì rẻ. Cho tôi xem code.”
― Linus Torvalds

design

Bảng Tham Khảo Cú Pháp Cron (2026): Đọc và Tạo Mọi Biểu Thức Crontab

Giải thích cú pháp cron: thứ tự 5 trường, mô hình đọc trong 10 giây, 16 biểu thức đã kiểm chứng, cái bẫy OR của ngày trong tuần, các lỗi DST và so sánh cron với systemd timers.

10 min read

công cụ kiểm regex và tạo pattern cho developer — hình minh họa hero gốc

design

Regex Tester & Pattern Builder: Hướng Dẫn Thực Hành Viết Regex Xịn Xò, Chạy Chuẩn

Cách viết regex thực sự hiệu quả: từ anchor, quantifier, cái bẫy khác biệt giữa các engine, đến lỗi ReDoS có thể làm sập server của bạn. Hãy luôn test khi viết.

9 min read

Mọi thứ bắt đầu chỉ với HTML, CSS và một chút JavaScript.

design

Base64 Encoding giải thích: Khi nào và tại sao Dev dùng (và những cạm bẫy nên tránh)

Base64 hoạt động như thế nào (3 byte thành 4 ký tự ASCII, cồng kềnh thêm 33%), các trường hợp sử dụng thực tế (data URIs, JWT, Basic auth), và những cạm bẫy: nó không phải mã hóa và cũng chẳng nén dữ liệu.

8 min read

Một mã QR có thể quét trên nền xanh lá, minh họa cho thiết kế mã QR mang thương hiệu riêng

design

Mã QR Mang Thương Hiệu Riêng: Thêm Logo và Màu Sắc Với Công Cụ Tạo Mã QR Miễn Phí

Cách cơ chế sửa lỗi cho phép bạn chèn logo lên mã QR, các quy tắc về độ tương phản và vùng yên tĩnh để mã vẫn quét được, và sự thật về mã QR tĩnh so với động.

8 min read

Các thẻ màu Swatchos hiển thị giá trị CMYK và HEX RGB đang được sử dụng bởi một đồ họa trên bàn làm việc của họ

design

HEX sang RGB sang CMYK năm 2026: Tại sao màu in luôn khác màu trên màn hình

Đổi HEX sang RGB là phép toán chính xác tuyệt đối. Nhưng RGB sang CMYK lại là một phép 'đoán mò' có sự hao hụt, phụ thuộc vào máy in, chất liệu giấy và hồ sơ màu ICC. Đây là sự khác biệt, các phép toán thực tế, và lúc nào thì công cụ chuyển đổi trực tuyến thực sự hữu ích.

8 min read

Cận cảnh tờ sticker sheet Google Material design trên MacBook.

design

Công cụ bảng màu trợ năng: Vì sao hầu hết bảng màu thất bại trước khi bạn tung ra

83.6% trang chủ không đạt tiêu chuẩn tương phản. Cách chọn công cụ kiểm chứng bảng màu trợ năng, tránh sai lầm phổ biến và kiểm tra đúng tổ hợp màu.

9 min read