JSON, JSON5 và JSONC
Kết luận: Các siêu ngôn ngữ nghiêm ngặt theo thứ tự: JSONC thêm chú thích; JSON5 thêm nháy đơn, khóa không nháy, dấu phẩy cuối và số thập lục phân. Chọn sai sẽ làm hỏng API, chứ không phải trình soạn thảo.

Tóm lại: hãy dùng JSON chuẩn bất cứ khi nào dữ liệu đi qua ranh giới hệ thống, chỉ dùng JSONC cho cấu hình cục bộ do con người chỉnh sửa; cân nhắc JSON5 khi bạn cần nháy đơn, dấu phẩy cuối hay khóa không nháy, nhưng hãy xác nhận trình nạp hỗ trợ nó trước.
Nói một dòng: JSONC là JSON cộng chú thích; JSON5 là JSON cộng thói quen JavaScript.
Ma trận tính năng
| Tính năng | JSON | JSONC | JSON5 |
|---|---|---|---|
| Chuỗi nháy kép | ✅ | ✅ | ✅ |
| Chuỗi nháy đơn | ❌ | ❌ | ✅ |
| Khóa không nháy | ❌ | ❌ | ✅ |
Chú thích dòng // |
❌ | ✅ | ✅ |
Chú thích khối /* */ |
❌ | ✅ | ✅ |
| Dấu phẩy cuối | ❌ | ❌ | ✅ |
Số thập lục phân 0xFF |
❌ | ❌ | ✅ |
Infinity / NaN |
❌ | ❌ | ✅ |
| Chuỗi nhiều dòng | ❌ | ❌ | ✅ |
| Bộ phân tích chuẩn đọc được | ✅ | ❌ | ❌ |
Lưu ý rằng JSONC chỉ giải quyết chú thích. Nhiều người tưởng "JSON cho phép chú thích" cũng cho phép dấu phẩy cuối; tsconfig.json vẫn lỗi với một dấu phẩy như vậy.
Mỗi loại dùng để làm gì
JSON — trao đổi dữ liệu. API, hàng đợi, cột JSON trong cơ sở dữ liệu, log. Mọi thứ máy với máy.
JSONC — cấu hình trình soạn thảo. VS Code tự phân tích những tệp này, nên JSON.parse không bao giờ thấy chúng. Không có RFC; đây là quy ước thực tế do Microsoft dẫn dắt.
JSON5 — một siêu ngôn ngữ dễ dãi cho con người. Mục tiêu là "cấu hình trông giống object literal JavaScript". Phù hợp nhất với tệp .json5 được công cụ build nạp; cú pháp rộng nhất và hỗ trợ công cụ hẹp nhất.
Cách chọn
| Tình huống | Chọn |
|---|---|
| Thân yêu cầu hoặc phản hồi | JSON, không có lựa chọn khác |
| Cột JSON trong MySQL / PostgreSQL | JSON, các hàm của chúng không nhận gì khác |
| Cấu hình dự án cần giải thích | JSONC nếu được hỗ trợ, nếu không thì YAML |
| Bạn muốn sự dễ dãi kiểu JS | JSON5, sau khi xác nhận trình nạp hỗ trợ |
| Người không phải kỹ sư sẽ chỉnh sửa | YAML, thụt lề dễ hơn ngoặc |
Một cái bẫy dễ gặp
Phân tích một tệp JSONC như JSON nghiêm ngặt sẽ tạo lỗi chỉ vào chú thích:
SyntaxError: Unexpected token / in JSON at position 42
Trước khi xóa chú thích, hãy kiểm tra xem tệp có phải cố ý là JSONC không. Xóa nó đi và bạn có thể vẫn gặp dấu phẩy cuối hai dòng sau.
Câu hỏi thường gặp
Tôi nên chọn JSONC hay JSON5?
Dùng JSONC khi chú thích là thứ duy nhất bạn cần: nó thêm // và /* */ lên trên JSON, và settings.json cùng tsconfig.json của VS Code dùng nó. Dùng JSON5 khi bạn còn muốn nháy đơn, khóa không nháy, dấu phẩy cuối, số thập lục phân hay chuỗi nhiều dòng. Cả hai đều phụ thuộc vào trình nạp, nên hãy xác nhận công cụ đọc tệp hỗ trợ nó.
Vì sao không thể đọc tệp JSONC như JSON chuẩn?
JSONC là quy ước thực tế, không phải một RFC riêng, nên các bộ phân tích chuẩn từ chối chú thích. JSON.parse trên tệp như vậy ném Unexpected token /, chỉ vào chú thích chứ không phải dữ liệu. Chỉ cấu hình được trình soạn thảo hoặc bộ phân tích chuyên dụng đọc mới nên viết dưới dạng JSONC.
Tôi có nên gửi tệp JSON5 cho một API không?
Không. API, cột JSON trong cơ sở dữ liệu và hàng đợi đều phân tích JSON nghiêm ngặt, nên nháy đơn, khóa không nháy và dấu phẩy cuối của JSON5 đều bị từ chối. JSON5 dành cho cấu hình cục bộ do con người chỉnh sửa; hãy chuyển nó về JSON chuẩn trước khi đi qua ranh giới hệ thống.