JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu dựa trên văn bản, dựa trên cú pháp đối tượng JavaScript. Nó được sử dụng ở khắp mọi nơi: từ API REST và tệp cấu hình đến lưu trữ dữ liệu trong cơ sở dữ liệu và ứng dụng di động. Theo trang web chính thức của JSON, định dạng này độc lập với ngôn ngữ lập trình và được hỗ trợ bởi hầu hết các nền tảng hiện đại. JSON đã trở thành tiêu chuẩn thực tế cho việc truyền dữ liệu giữa máy khách và máy chủ.
Những điểm chính
JSON là một định dạng văn bản để biểu diễn dữ liệu có cấu trúc, dựa trên cú pháp JavaScript. Mặc dù có nguồn gốc từ JavaScript, định dạng này hoàn toàn độc lập với ngôn ngữ — trình phân tích và tuần tự hóa tồn tại cho tất cả các ngôn ngữ lập trình phổ biến.
Lịch sử của JSON bắt đầu vào đầu những năm 2000, khi Douglas Crockford trích xuất một tập con của cú pháp JavaScript để trao đổi dữ liệu. Năm 2013, định dạng này được tiêu chuẩn hóa thành ECMA-404, và sau đó là ISO/IEC 21778:2017. Tên viết tắt của JavaScript Object Notation.
Ưu điểm chính của JSON là cú pháp tối giản. Chỉ sáu kiểu được sử dụng để mô tả dữ liệu: chuỗi, số, boolean, null, mảng và đối tượng. Điều này đủ để biểu diễn bất kỳ cấu trúc dữ liệu nào được sử dụng trong ứng dụng.
Cú pháp JSON cực kỳ đơn giản: dữ liệu được biểu diễn dưới dạng cặp khóa-giá trị, trong đó khóa là một chuỗi trong dấu ngoặc kép và giá trị là một trong sáu kiểu cơ bản. Đối tượng được đặt trong dấu ngoặc nhọn, mảng trong dấu ngoặc vuông. Chuỗi phải sử dụng dấu ngoặc kép; dấu ngoặc đơn không được phép.
Số trong JSON có thể là số nguyên hoặc dấu phẩy động, dương hoặc âm, với ký hiệu số mũ. Giá trị boolean được biểu diễn bằng các ký tự true và false, và sự vắng mặt của giá trị bằng null. Mảng chứa một tập hợp có thứ tự các giá trị thuộc bất kỳ kiểu nào, bao gồm mảng và đối tượng lồng nhau.
{
"name": "JSON",
"type": "text",
"version": 2024,
"flexible": true,
"extensions": null,
"languages": [
"JavaScript",
"Python",
"Java"
],
"nested": {
"info": "hỗ trợ lồng nhau"
}
}
| Kiểu | Ví dụ | Mô tả |
|---|---|---|
| Chuỗi | “văn bản” |
Trong dấu ngoặc kép, với chuỗi thoát |
| Số | 42 |
Nguyên, dấu phẩy động, số mũ |
| Boolean | true |
true hoặc false — không có dấu ngoặc |
| null | null |
Không có giá trị |
| Đối tượng | {} |
Tập hợp không có thứ tự các cặp khóa-giá trị |
| Mảng | [] |
Danh sách có thứ tự các giá trị |
JSON là định dạng trao đổi dữ liệu chính cho API REST trong phát triển di động và web. Máy chủ gửi JSON trong phần thân phản hồi, máy khách trong phần thân yêu cầu. Tiêu đề Content-Type tiêu chuẩn cho JSON là application/json.
API REST hiện đại sử dụng JSON để truyền tải tất cả các loại dữ liệu: từ danh sách đơn giản đến cấu trúc lồng nhau phức tạp với mối quan hệ giữa các thực thể. Thư viện máy khách (như Axios trong JavaScript hoặc Retrofit trên Android) tự động tuần tự hóa và giải tuần tự hóa JSON, giải phóng nhà phát triển khỏi việc phân tích thủ công.
Một lợi thế quan trọng của JSON trong API REST là khả năng truyền dữ liệu một phần (phản hồi một phần) qua tham số truy vấn, cũng như hỗ trợ tài nguyên lồng nhau mà không cần yêu cầu bổ sung đến máy chủ.
Phân tích JSON trên nền tảng di động được thực hiện bằng các công cụ tích hợp sẵn. Android sử dụng Gson của Google hoặc Moshi của Square, iOS sử dụng giao thức Codable với JSONDecoder. Mỗi nền tảng cung cấp các công cụ thuận tiện để chuyển đổi JSON thành đối tượng gốc và ngược lại.
Trên Android, cách tiếp cận phổ biến sử dụng Gson hoặc Moshi. Chỉ cần định nghĩa một lớp dữ liệu với chú thích @SerializedName và gọi fromJson để giải tuần tự hóa. Thư viện tự động ánh xạ tên trường JSON với thuộc tính của lớp.
import com.google.gson.Gson
import com.google.gson.annotations.SerializedName
data class User(
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String,
@SerializedName("email") val email: String
)
fun parseJson(jsonString: String): User {
val gson = Gson()
return gson.fromJson(jsonString, User::class.java)
}
Trên iOS, giao thức tích hợp sẵn Codable với JSONDecoder được sử dụng. Cấu trúc dữ liệu được khai báo như một struct tuân thủ Codable, sau đó JSON được phân tích bằng một dòng duy nhất. JSONEncoder thực hiện tuần tự hóa ngược — chuyển đổi đối tượng thành JSON để gửi đến máy chủ.
import Foundation
struct User: Codable {
let id: Int
let name: String
let email: String
}
func parseJSON(from data: Data) throws -> User {
let decoder = JSONDecoder()
return try decoder.decode(User.self, from: data)
}
JSON và XML là hai định dạng chính để truyền tải dữ liệu có cấu trúc. JSON chiến thắng về sự đơn giản và hiệu suất, XML về tính chặt chẽ và xác thực. Sự lựa chọn giữa chúng phụ thuộc vào yêu cầu của dự án: API REST thường sử dụng JSON, tài liệu phức tạp với lược đồ sử dụng XML.
XML yêu cầu thẻ đóng cho mỗi phần tử, làm tăng kích thước dữ liệu lên 2-3 lần so với JSON. Đồng thời, XML hỗ trợ không gian tên, lược đồ XSD, thuộc tính và chuyển đổi XSLT, làm cho nó mạnh mẽ hơn cho quản lý tài liệu và tích hợp hệ thống doanh nghiệp.
| Đặc điểm | JSON | XML |
|---|---|---|
| Cú pháp | Tối giản, khóa-giá trị | Dựa trên thẻ, thẻ mở và đóng |
| Kích thước dữ liệu | Nhỏ gọn | Lớn hơn JSON 2-3 lần |
| Kiểu dữ liệu | Sáu kiểu cơ bản | Chỉ văn bản, kiểu qua lược đồ |
| Xác thực | Không tích hợp, qua JSON Schema | XSD — chặt chẽ và trưởng thành |
| Không gian tên | Không có | Hỗ trợ không gian tên đầy đủ |
| Tốc độ phân tích | Cao | Thấp hơn do độ phức tạp |
Các ví dụ minh họa các thao tác điển hình với JSON trong phát triển di động: phân tích phản hồi API, tạo JSON để gửi và xử lý cấu trúc lồng nhau. Hiểu các mẫu này là cần thiết cho bất kỳ nhà phát triển ứng dụng di động nào.
Trong JavaScript, JSON.stringify chuyển đổi đối tượng thành chuỗi JSON. Đối số thứ hai có thể là một mảng các khóa để tuần tự hóa chọn lọc hoặc một hàm thay thế. Đối số thứ ba đặt thụt lề cho định dạng.
interface Order {
id: string;
items: OrderItem[];
total: number;
createdAt: string;
}
const order: Order = {
id: 'ord_001',
items: [{ product: 'phone', quantity: 2 }],
total: 1599.98,
createdAt: '2026-07-03T10:00:00Z'
};
const jsonString = JSON.stringify(order, null, 2);
Trong Kotlin với thư viện Moshi, các đối tượng JSON lồng nhau được xử lý thông qua các lớp dữ liệu lồng nhau. Chú thích @Json chỉ định tên trường JSON nếu nó khác với tên thuộc tính của lớp. Mảng được biểu diễn dưới dạng List với kiểu phần tử.
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
data class ApiResponse(
val status: String,
val data: List<Product>,
val pagination: Pagination
)
data class Product(
val id: Int,
val title: String,
val price: Double
)
data class Pagination(
val page: Int,
val total: Int
)
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
JSON Schema là một ngôn ngữ để mô tả cấu trúc của tài liệu JSON, tương tự như XSD cho XML. Sử dụng JSON Schema, bạn có thể chỉ định các trường bắt buộc, kiểu dữ liệu, phạm vi giá trị, mẫu chuỗi và cấu trúc lồng nhau. Xác thực lược đồ phát hiện lỗi dữ liệu trước khi chúng được xử lý trong ứng dụng.
JSON Schema được sử dụng rộng rãi trong OpenAPI (Swagger) để tài liệu hóa API REST, trong biểu mẫu xác thực dữ liệu đầu vào và trong kiểm thử. Bản thân tệp lược đồ là một tài liệu JSON, cho phép các trình phân tích JSON tiêu chuẩn đọc nó. Có các trình xác thực trực tuyến và thư viện cho tất cả các ngôn ngữ lập trình phổ biến.
Trong phát triển di động, JSON Schema được sử dụng để xác thực phản hồi từ máy chủ trong quá trình kiểm thử và để kiểm tra tệp cấu hình. Các thư viện như network-validator trên Android và json-schema-validator cho phép nhúng xác thực trực tiếp vào quy trình phát triển, ngăn ngừa lỗi ở giai đoạn đầu.
Câu hỏi thường gặp
JSON hỗ trợ sáu kiểu: chuỗi (trong dấu ngoặc kép), số (nguyên và dấu phẩy động), boolean (true/false), null, đối tượng (cặp khóa-giá trị trong {}) và mảng (danh sách giá trị trong []). Điều này đủ cho bất kỳ cấu trúc dữ liệu nào trong ứng dụng.
Không, tiêu chuẩn JSON không hỗ trợ chú thích. Nếu bạn cần chú thích, hãy sử dụng JSON5 (JSON mở rộng) hoặc thêm trường mô tả, ví dụ “_comment”: “giải thích”. Một số công cụ, như VS Code, hỗ trợ chú thích trong tệp JSON cấu hình, nhưng đây là phần mở rộng không tiêu chuẩn.
JSONB là định dạng lưu trữ nhị phân cho JSON trong PostgreSQL. Không giống như JSON dạng văn bản, JSONB xử lý nhanh hơn, hỗ trợ lập chỉ mục (chỉ mục GIN) và đảm bảo tính duy nhất của khóa. Tuy nhiên, JSONB chiếm nhiều dung lượng đĩa hơn do siêu dữ liệu được thêm vào.
Sử dụng JSONLint (jsonlint.com) để kiểm tra nhanh, JSON.parse() tích hợp sẵn trong JavaScript với try-catch, hoặc plugin IDE. Xác thực bao gồm kiểm tra dấu ngoặc đúng, đóng ngoặc và tuân thủ kiểu. Đối với lược đồ phức tạp, hãy sử dụng JSON Schema Validator.
Không có giới hạn trong đặc tả JSON. Trong thực tế, kích thước bị giới hạn bởi bộ nhớ thiết bị và khả năng của trình phân tích. Đối với ứng dụng di động, khuyến nghị không vượt quá 1-2 MB cho mỗi phản hồi và đối với dữ liệu lớn, hãy sử dụng phân trang hoặc truyền phát trực tuyến.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm