1. JSON (JavaScript Object Notation) là gì?
JSON (đọc là “giây-sơn”, không phải “zhê-son”!) viết tắt của JavaScript Object Notation. Mặc dù có từ “JavaScript” trong tên, JSON là một định dạng phổ quát, được hầu như mọi ngôn ngữ lập trình hỗ trợ, bao gồm cả Java.
JSON được Douglas Crockford đề xuất vào đầu những năm 2000 như một cách đơn giản để trao đổi dữ liệu giữa trình duyệt và máy chủ. Trước đó, XML chiếm ưu thế — dài dòng và nặng nề với nhiều thẻ.
JSON gọn hơn, đơn giản hơn và dễ đọc bằng mắt thường. Nó nhanh chóng trở thành tiêu chuẩn de facto cho trao đổi dữ liệu giữa client và server, đặc biệt trên web và trong ứng dụng di động.
Vì sao JSON trở thành tiêu chuẩn?
- Cú pháp đơn giản — dễ viết và đọc thủ công.
- Tính gọn — không có thẻ thừa và “rườm rà”.
- Dễ đọc — ngay cả người không chuyên cũng hiểu đang có gì diễn ra.
- Dễ phân tích cú pháp — đa số ngôn ngữ có thư viện tích hợp/bên thứ ba.
- Đa ngôn ngữ — Java, Python, Kotlin, v.v. — tất cả đều hỗ trợ JSON.
- Tiêu chuẩn cho REST API — phần lớn API trả về JSON.
So sánh với XML
| JSON | XML | |
|---|---|---|
| Tính dễ đọc | Rất cao | Trung bình (nhiều thẻ) |
| Kích thước | Gọn | Cồng kềnh hơn |
| Phân tích cú pháp | Đơn giản | Đòi hỏi nhiều công sức hơn |
| Khả năng mở rộng | Hỗ trợ lồng nhau | Hỗ trợ lồng nhau |
| Tính nghiêm ngặt | Kém nghiêm ngặt | Có thể mô tả lược đồ |
| Mức độ phổ biến (2020+) | Rất cao | Vẫn dùng, nhưng ít hơn |
JSON thắng thế gần như ở mọi khía cạnh. Tuy nhiên, XML vẫn phù hợp ở nơi cần lược đồ phức tạp, kiểu dữ liệu chặt chẽ, xác thực theo XSD, hỗ trợ chú thích và thuộc tính — ví dụ trong các hệ thống cũ và phần mềm ngân hàng.
Trong thực tế, nếu bạn không viết phần mềm cho ngân hàng hoặc tàu vũ trụ — hãy dùng JSON.
2. Cú pháp cơ bản của JSON
Nếu bạn từng làm việc với đối tượng JavaScript hoặc “dictionary” ở các ngôn ngữ khác, cú pháp này sẽ quen thuộc. Trong Java không có “dictionary” trực tiếp, vai trò đó do các collection trong java.util đảm nhiệm, chủ yếu là Map<K, V> (phổ biến nhất — HashMap<K, V>).
Các thành phần chính
- Đối tượng — tập các cặp “khóa: giá trị”, bao trong { }.
- Mảng — danh sách có thứ tự các giá trị, bao trong [ ].
Ví dụ đối tượng:
{
"name": "Alice",
"age": 25
}
Ví dụ mảng:
[1, 2, 3, 4, 5]
Ví dụ đối tượng chứa mảng:
{
"students": [
"Ivan",
"Maria",
"John"
]
}
Kiểu giá trị hợp lệ
Trong JSON chỉ có các kiểu dữ liệu sau:
| Kiểu | Ví dụ | Mô tả |
|---|---|---|
| Chuỗi | |
Luôn trong dấu nháy kép |
| Số | |
Số nguyên và số thực |
| Boolean | |
Giá trị logic |
| null | |
Rỗng, không có giá trị |
| Đối tượng | |
Tập các cặp “khóa: giá trị” |
| Mảng | |
Danh sách các giá trị |
Lưu ý: khóa trong đối tượng luôn là chuỗi trong dấu nháy kép, ví dụ "name". Không dùng dấu nháy đơn.
Ví dụ JSON hợp lệ
{
"id": 1,
"name": "Bob",
"active": true,
"scores": [10, 20, 30],
"profile": {
"email": "bob@example.com",
"phone": null
}
}
Ví dụ JSON không hợp lệ (lỗi)
{
name: 'Bob', // Lỗi: khóa và chuỗi — chỉ dùng dấu nháy kép!
age: 25,
}
3. Cấu trúc dữ liệu: lồng nhau giữa đối tượng và mảng
JSON hỗ trợ lồng nhau sâu: đối tượng trong đối tượng, mảng trong đối tượng, đối tượng trong mảng, v.v. Nó giống như búp bê Matryoshka.
Ví dụ tài liệu JSON phức tạp
{
"university": "Java University",
"students": [
{
"name": "Ivan",
"age": 20,
"courses": ["Math", "Java", "English"]
},
{
"name": "Maria",
"age": 19,
"courses": ["Biology", "Java", "Art"]
}
],
"active": true
}
Trong đối tượng gốc có trường chuỗi "university", trường boolean "active" và mảng "students", trong đó chứa các đối tượng sinh viên.
Sơ đồ trực quan (lưu đồ)
{
"khóa": giá trị,
"mảng": [
{ "khóa": giá trị },
{ "khóa": giá trị }
],
"đối tượng": {
"khóa": giá trị
}
}
4. Ưu điểm của JSON
Vì sao JSON phổ biến đến vậy?
- Dễ đọc với con người và máy — cấu trúc dễ hiểu.
- Tính gọn — tối thiểu ký tự thừa.
- Dễ phân tích cú pháp — nhiều thư viện đọc/ghi.
- Tiêu chuẩn cho REST API và ứng dụng di động — được dùng ở khắp nơi.
- Linh hoạt — mô tả cả danh sách đơn giản lẫn cấu trúc dạng cây.
- Cấu hình, thiết lập, lưu trữ dữ liệu — thường dùng trong file cấu hình.
- Được mọi ngôn ngữ hỗ trợ — Java, Python, Go, Rust, v.v.
5. Thực hành: phân tích các ví dụ tệp JSON
Ví dụ 1: Danh sách người dùng
[
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
}
]
Đây là một mảng, nơi mỗi phần tử là một đối tượng người dùng.
Ví dụ 2: Cấu hình ứng dụng
{
"debug": true,
"maxConnections": 100,
"database": {
"host": "localhost",
"port": 5432,
"user": "admin",
"password": "qwerty"
}
}
Đối tượng có đối tượng lồng nhau "database". Rất giống với cấu hình thực tế của ứng dụng.
Ví dụ 3: Lỗi trong JSON
{
"name": "Alice",
"age": 25,
} // Lỗi: dấu phẩy thừa trước ngoặc đóng!
Hãy ghi nhớ: trong JSON không được đặt dấu phẩy sau phần tử cuối cùng.
Ví dụ 4: Khóa không có dấu nháy
{ name: "Alice", age: 25 } // Lỗi: khóa phải trong dấu nháy kép!
6. Các lưu ý hữu ích
Bảng: điều được phép và không được phép trong JSON
| Được | Không được |
|---|---|
|
|
|
|
|
|
|
|
|
|
So sánh ngắn giữa JSON và đối tượng Java
| Java | JSON |
|---|---|
|
Số, true/false |
|
"chuỗi" |
| List<T>, mảng | [giá trị 1, giá trị 2, ...] |
|
{ "khóa": giá trị, ... } |
|
null |
| Lớp với các trường | { "trường": giá trị, ... } |
Ví dụ: lớp Java và biểu diễn JSON của nó
public class Student {
public String name;
public int age;
}
{
"name": "Alice",
"age": 20
}
7. Những lỗi thường gặp khi làm việc với JSON
Lỗi #1: Dấu nháy đơn thay cho dấu nháy kép. JSON chỉ chấp nhận dấu nháy kép cho khóa và chuỗi.
{ 'name': 'Alice' } // Lỗi!
Lỗi #2: Dấu phẩy thừa. Không được đặt dấu phẩy sau phần tử cuối.
{ "name": "Alice", } // Lỗi!
Lỗi #3: Khóa không có dấu nháy. Khóa luôn phải đặt trong dấu nháy kép.
{ name: "Alice" } // Lỗi!
Lỗi #4: Số có số 0 ở đầu. Các số như vậy là không hợp lệ.
{ "age": 025 } // Lỗi!
Lỗi #5: Sử dụng undefined. JSON không có undefined, hãy dùng null.
{ "value": undefined } // Lỗi!
Lỗi #6: True/False viết hoa chữ cái đầu. Trong JSON chỉ có true và false (chữ thường).
{ "active": True } // Lỗi!
GO TO FULL VERSION