Định Dạng JSON Và Kỹ Thuật Xử Lý Dữ Liệu Trong JavaScript

JSON (JavaScript Object Notation) là một chuẩn định dạng văn bản dùng để trao đổi dữ liệu, được thiết kế để dễ đọc đối với con người và dễ phân tích đối với máy móc. Mặc dù có nguồn gốc từ JavaScript, JSON hiện nay là định dạng độc lập với ngôn ngữ lập trình.

Trước khi JSON trở nên phổ biến, XML thường được sử dụng làm chuẩn trao đổi dữ liệu chính. Tuy XML cũng là định dạng văn bản, nhưng các quy chuẩn đi kèm như DTD, XSD hay XSLT khiến việc xử lý trở nên phức tạp và nặng nề. JSON ra đời như một giải pháp thay thế nhẹ nhàng, loại bỏ các cấu trúc rườm rà để tập trung vào dữ liệu thuần túy.

JSON thực chất là một tập con của cú pháp JavaScript. Một tệp JSON hợp lệ chỉ bao gồm các kiểu dữ liệu cơ bản sau:

  • number: Số thực hoặc số nguyên, tương đồng với kiểu số trong JavaScript.
  • boolean: Giá trị logic true hoặc false.
  • string: Chuỗi ký tự, bắt buộc phải được bao quanh bởi dấu ngoặc kép.
  • null: Giá trị rỗng.
  • array: Mảng dữ liệu, được ký hiệu bằng dấu ngoặc vuông [].
  • object: Đối tượng chứa các cặp khóa-giá trị, được ký hiệu bằng dấu ngoặc nhọn {}.

Một quy tắc bắt buộc trong JSON là tất cả các khóa (key) và chuỗi ký tự (string) đều phải sử dụng dấu ngoặc kép "". Bộ ký tự mặc định là UTF-8, hỗ trợ đầy đủ các ngôn ngữ trên thế giới.

Biến đổi đối tượng thành chuỗi (Serialization)

Để truyền tải dữ liệu qua mạng, các đối tượng JavaScript cần được chuyển đổi thành chuỗi văn bản định dạng JSON. Quá trình này gọi là serialization. Trong JavaScript, phương thức JSON.stringify() đảm nhiệm việc này.

Xét ví dụ về thông tin một lập trình viên:

const developerInfo = {
    fullName: 'Nguyễn Văn A',
    experience: 5,
    isAvailable: true,
    salary: 2000.50,
    certificate: null,
    'current-company': 'Tech Corp',
    languages: ['JavaScript', 'Go', 'Rust']
};

Để chuyển đối tượng trên thành chuỗi JSON:

const jsonStr = JSON.stringify(developerInfo);
console.log(jsonStr);

Kết quả trả về là một chuỗi đơn dòng. Để dễ đọc hơn, chúng ta có thể sử dụng tham số thứ ba để định dạng thụt lề:

JSON.stringify(developerInfo, null, 4);

Phương thức stringify còn cho phép lọc các thuộc tính cần thiết bằng cách truyền vào một mảng ở tham số thứ hai. Ví dụ, nếu chỉ muốn lấy tên và danh sách ngôn ngữ:

JSON.stringify(developerInfo, ['fullName', 'languages'], 4);

Ngoài ra, chúng ta có thể truyền vào một hàm xử lý (replacer function) để biến đổi giá trị trước khi chuỗi hóa. Đoạn mã dưới đây sẽ chuyển tất cả các chuỗi ký tự thành chữ in hoa:

function transformData(key, value) {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value;
}

JSON.stringify(developerInfo, transformData, 4);

Trong trường hợp cần kiểm soát hoàn toàn quá trình chuỗi hóa của một đối tượng cụ thể, ta có thể định nghĩa phương thức toJSON() ngay trong đối tượng đó. Phương thức này sẽ trả về cấu trúc dữ liệu mong muốn:

const employee = {
    fullName: 'Nguyễn Văn A',
    experience: 5,
    isAvailable: true,
    toJSON: function () {
        return {
            'Name': this.fullName,
            'Years': this.experience
        };
    }
};

JSON.stringify(employee); // Kết quả: {"Name":"Nguyễn Văn A","Years":5}

Phân tích chuỗi thành đối tượng (Deserialization)

Khi nhận được dữ liệu JSON từ máy chủ hoặc API, chúng ta cần chuyển ngược lại thành đối tượng JavaScript để sử dụng. Phương thức JSON.parse() sẽ thực hiện việc giải mã này.

JSON.parse('[10, 20, 30]'); // Trả về mảng [10, 20, 30]
JSON.parse('{"id": 1, "active": true}'); // Trả về object
JSON.parse('null'); // Trả về null

JSON.parse() cũng hỗ trợ một hàm reviver làm tham số thứ hai. Hàm này được gọi với từng cặp khóa-giá trị trong quá trình phân tích, cho phép biến đổi dữ liệu ngay lúc khởi tạo. Ví dụ, chúng ta có thể thêm hậu tố cho chức vụ:

const data = '{"role":"developer","level":3}';
const obj = JSON.parse(data, function (key, value) {
    if (key === 'role') {
        return value + ' Senior';
    }
    return value;
});

console.log(obj.role); // "developer Senior"

Thẻ: JSON JavaScript Serialization Deserialization data-interchange

Đăng vào ngày 31 tháng 5 lúc 18:13