JSON Là Gì? Hướng Dẫn Format, Validate Và Debug JSON Cho Developer
Tìm hiểu JSON từ cơ bản đến nâng cao. Cú pháp JSON, các lỗi phổ biến, cách format/validate/minify, và ứng dụng trong API, config, database. Có ví dụ code thực tế.
DedevTool
JSON Là Gì? Hướng Dẫn Format, Validate Và Debug JSON Cho Developer
Nếu bạn là developer – dù frontend, backend, mobile hay data – bạn làm việc với JSON mỗi ngày. Nhưng bạn có thực sự hiểu JSON sâu? Bạn có biết tại sao JSON thắng XML? Hay tại sao dấu phẩy cuối cùng (trailing comma) lại gây crash API?
Bài viết này không chỉ là "JSON là gì" – mà là tất cả những gì developer cần biết để làm việc hiệu quả với JSON trong thực tế 2026.
1. JSON Là Gì?
JSON (JavaScript Object Notation) là định dạng dữ liệu dạng text, dùng để trao đổi dữ liệu giữa client và server, giữa các hệ thống khác nhau.
{
"name": "Nguyễn Văn A",
"age": 28,
"email": "a@example.com",
"isActive": true,
"skills": ["JavaScript", "Python", "Go"],
"address": {
"city": "Hồ Chí Minh",
"country": "Vietnam"
}
}
Tại Sao JSON Thắng XML?
| Tiêu chí | JSON | XML |
|---|---|---|
| Cú pháp | Ngắn gọn, dễ đọc | Dài dòng, nhiều tag |
| Kích thước | Nhỏ hơn ~30–50% | Lớn hơn |
| Parse speed | Nhanh (native JS) | Chậm hơn |
| Hỗ trợ | Mọi ngôn ngữ | Mọi ngôn ngữ |
| Năm ra đời | 2001 (Douglas Crockford) | 1996 |
JSON nhỏ hơn, nhanh hơn, dễ đọc hơn. Vì vậy 99% API REST hiện đại dùng JSON thay vì XML.
2. Cú Pháp JSON – 7 Quy Tắc Sống Còn
Quy tắc 1: Key PHẢI nằm trong dấu ngoặc kép
// ✅ Đúng
{ "name": "value" }
// ❌ Sai - key không có ngoặc kép
{ name: "value" }
// ❌ Sai - dùng ngoặc đơn
{ 'name': 'value' }
Quy tắc 2: String PHẢI dùng ngoặc kép (không phải ngoặc đơn)
// ✅ Đúng
{ "city": "Hà Nội" }
// ❌ Sai
{ "city": 'Hà Nội' }
Quy tắc 3: Không có trailing comma
// ✅ Đúng
{ "a": 1, "b": 2 }
// ❌ Sai - dấu phẩy sau phần tử cuối
{ "a": 1, "b": 2, }
Đây là lỗi phổ biến nhất khi viết JSON bằng tay. JavaScript cho phép trailing comma, nhưng JSON thì KHÔNG.
Quy tắc 4: Chỉ có 6 kiểu dữ liệu
| Kiểu | Ví dụ |
|---|---|
| String | "hello" |
| Number | 42, 3.14, -1, 1e10 |
| Boolean | true, false |
| Null | null |
| Object | { "key": "value" } |
| Array | [1, 2, 3] |
Không có: undefined, NaN, Infinity, Date, RegExp, comment, function.
Quy tắc 5: Không có comment
// ❌ JSON không hỗ trợ comment
{
"name": "value" // This will cause error
}
Nếu cần comment trong config file, dùng JSON5 hoặc JSONC (được VS Code hỗ trợ).
Quy tắc 6: Số không có leading zero
// ✅ Đúng
{ "price": 0.5 }
// ❌ Sai
{ "price": 00.5 }
{ "price": 007 }
Quy tắc 7: Unicode escape cho ký tự đặc biệt
{ "emoji": "\u2764" } // ❤️
{ "tab": "col1\tcol2" }
{ "newline": "line1\nline2" }
Format và validate JSON tự động: 👉 JSON Formatter & Validator
3. Các Lỗi JSON Phổ Biến Và Cách Fix
Lỗi 1: "Unexpected token"
Nguyên nhân: Trailing comma, thiếu ngoặc kép, hoặc ký tự không hợp lệ.
// ❌ Lỗi
{
"items": [1, 2, 3,],
"status": active
}
// ✅ Fix
{
"items": [1, 2, 3],
"status": "active"
}
Lỗi 2: "Unexpected end of JSON input"
Nguyên nhân: Thiếu ngoặc đóng } hoặc ], hoặc string rỗng.
// ❌ Crash
JSON.parse("")
// ✅ Fix
JSON.parse("{}") // hoặc check trước khi parse
const data = input ? JSON.parse(input) : {};
Lỗi 3: Circular reference khi serialize
const a = {};
const b = { ref: a };
a.ref = b;
// ❌ TypeError: Converting circular structure to JSON
JSON.stringify(a);
// ✅ Fix - dùng replacer
JSON.stringify(a, (key, value) => {
if (key === 'ref') return '[Circular]';
return value;
});
Lỗi 4: Date bị serialize thành string
const data = { date: new Date() };
const json = JSON.stringify(data);
// {"date":"2026-04-19T10:30:00.000Z"}
const parsed = JSON.parse(json);
parsed.date instanceof Date; // false! Nó là string
// ✅ Fix - dùng reviver
const parsed2 = JSON.parse(json, (key, value) => {
if (key === 'date') return new Date(value);
return value;
});
4. JSON Trong API – Best Practices 2026
Request/Response Format
// ✅ API Response chuẩn (success)
{
"status": "success",
"data": {
"users": [
{ "id": 1, "name": "Nguyễn Văn A" },
{ "id": 2, "name": "Trần Thị B" }
],
"total": 2,
"page": 1,
"perPage": 20
}
}
// ✅ API Response chuẩn (error)
{
"status": "error",
"error": {
"code": "VALIDATION_ERROR",
"message": "Email is required",
"details": [
{ "field": "email", "message": "Must be a valid email" }
]
}
}
Naming Convention
| Convention | Ví dụ | Dùng trong |
|---|---|---|
| camelCase | firstName, createdAt | JavaScript, TypeScript |
| snake_case | first_name, created_at | Python, Ruby, PostgreSQL |
| kebab-case | first-name | ❌ Không dùng trong JSON |
Quy tắc: Chọn một convention và dùng nhất quán trong toàn bộ API. Không mix firstName và last_name trong cùng response.
5. JSON vs Các Format Khác
| Format | Khi nào dùng | Ưu điểm |
|---|---|---|
| JSON | API, config đơn giản | Phổ biến, native JS |
| YAML | Config phức tạp (Docker, K8s) | Đọc dễ hơn JSON, hỗ trợ comment |
| TOML | Config (Rust, Python) | Rõ ràng, không bị indent hell |
| Protocol Buffers | gRPC, hiệu suất cao | Nhỏ 3–10x, nhanh 20–100x so JSON |
| MessagePack | Cache, WebSocket | Binary, nhỏ hơn JSON 30% |
| CSV | Data tabular | Excel mở được |
6. Tool Hữu Ích Cho Developer
Format JSON (đẹp hóa)
Khi nhận JSON một dòng từ API log:
{"user":{"id":1,"name":"Test","roles":["admin","editor"],"settings":{"lang":"vi","theme":"dark"}}}
Sau khi format:
{
"user": {
"id": 1,
"name": "Test",
"roles": ["admin", "editor"],
"settings": {
"lang": "vi",
"theme": "dark"
}
}
}
Minify JSON (nén)
Giảm 30–50% kích thước bằng cách bỏ whitespace – hữu ích cho:
- Lưu vào database
- Gửi qua WebSocket
- Giảm bandwidth API
Validate JSON
Kiểm tra JSON có hợp lệ hay không trước khi deploy. Một trailing comma có thể crash toàn bộ production config.
Tất cả các thao tác trên trong một công cụ: 👉 JSON Formatter, Validator & Minifier
7. JSON Schema – Type Safety Cho JSON
JSON Schema giúp validate cấu trúc JSON tự động:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1 },
"age": { "type": "integer", "minimum": 0, "maximum": 150 },
"email": { "type": "string", "format": "email" }
},
"required": ["name", "email"]
}
Khi nào dùng JSON Schema:
- Validate API request body
- Config file validation (CI/CD)
- Form validation (React Hook Form + Zod compile to JSON Schema)
8. Performance Tips
Parse lớn → Dùng streaming parser
Với JSON > 100MB, JSON.parse() sẽ block event loop. Dùng streaming:
// Node.js
import { parser } from 'stream-json';
import { streamArray } from 'stream-json/streamers/StreamArray';
fs.createReadStream('huge-file.json')
.pipe(parser())
.pipe(streamArray())
.on('data', ({ value }) => processItem(value));
Serialize nhanh hơn JSON.stringify
Thư viện fast-json-stringify nhanh hơn 2–10x nếu bạn biết schema trước:
const stringify = fastJson({
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'integer' }
}
});
stringify({ name: 'Test', age: 28 }); // 2-10x faster
9. Câu Hỏi Thường Gặp
JSON có giống JavaScript Object không?
Gần giống nhưng KHÔNG giống nhau. JavaScript Object cho phép: trailing comma, key không ngoặc kép, single quote, undefined, function, Symbol. JSON thì không.
Làm sao thêm comment vào JSON?
Dùng JSONC (đổi extension thành .jsonc) hoặc JSON5. VS Code settings.json thực ra là JSONC.
JSON max size là bao nhiêu?
Theo spec: không giới hạn. Trên thực tế, JSON.parse() trong V8 (Chrome/Node.js) xử lý tốt đến ~500MB. Nginx default limit request body 1MB.
Công Cụ JSON Online Miễn Phí
Format, validate, minify trong 1 click – không cần cài extension: