CodeGym /Các khóa học /JAVA 25 SELF /Cơ bản về JSON: cấu trúc, cú pháp, ưu điểm

Cơ bản về JSON: cấu trúc, cú pháp, ưu điểm

JAVA 25 SELF
Mức độ , Bài học
Có sẵn

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
"hello"
Luôn trong dấu nháy kép
Số
123, 3.14, -7
Số nguyên và số thực
Boolean
true, false
Giá trị logic
null
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?

  1. Dễ đọc với con người và máy — cấu trúc dễ hiểu.
  2. Tính gọn — tối thiểu ký tự thừa.
  3. Dễ phân tích cú pháp — nhiều thư viện đọc/ghi.
  4. Tiêu chuẩn cho REST API và ứng dụng di động — được dùng ở khắp nơi.
  5. Linh hoạt — mô tả cả danh sách đơn giản lẫn cấu trúc dạng cây.
  6. Cấu hình, thiết lập, lưu trữ dữ liệu — thường dùng trong file cấu hình.
  7. Đượ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
"khóa": "giá trị"
'khóa': 'giá trị'
"khóa": 123
"khóa": 0123
"khóa": null
"khóa": undefined
"khóa": true
"khóa": True
"khóa": [1, 2, 3]
"khóa": [1, 2, 3,]

So sánh ngắn giữa JSON và đối tượng Java

Java JSON
int, double, boolean
Số, true/false
String
"chuỗi"
List<T>, mảng [giá trị 1, giá trị 2, ...]
Map<String, Object>
{ "khóa": giá trị, ... }
null
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ó truefalse (chữ thường).

{ "active": True } // Lỗi!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION