Đọc/ghi file JSON
Khác với CSV, JSON không có cách phân tách đơn giản bằng dấu phẩy - cấu trúc lồng nhau của JSON (object, array, chuỗi có ký tự đặc biệt…) khiến việc tự viết parser rất phức tạp và dễ lỗi. Vì thư viện chuẩn C++ không có module xử lý JSON có sẵn, cách phổ biến nhất là dùng thư viện bên thứ ba.
Thư viện phổ biến: nlohmann/json
Phần tiêu đề “Thư viện phổ biến: nlohmann/json”nlohmann/json là thư viện JSON được dùng rộng rãi nhất trong cộng đồng C++, nổi tiếng vì cú pháp trực quan, dễ dùng - chỉ cần một file header duy nhất (json.hpp) để thêm vào project.
Ghi dữ liệu ra JSON
Phần tiêu đề “Ghi dữ liệu ra JSON”#include <nlohmann/json.hpp>#include <fstream>
int main() { nlohmann::json data;
data["name"] = "Alice"; data["age"] = 20; data["gpa"] = 3.8; data["courses"] = {"Math", "Physics", "Chemistry"}; // Mảng
std::ofstream file("student.json"); file << data.dump(4); // dump(4): định dạng đẹp, thụt lề 4 khoảng trắng file.close();
return 0;}Kết quả trong student.json:
{ "name": "Alice", "age": 20, "gpa": 3.8, "courses": ["Math", "Physics", "Chemistry"]}Đọc dữ liệu từ JSON
Phần tiêu đề “Đọc dữ liệu từ JSON”#include <nlohmann/json.hpp>#include <fstream>#include <iostream>
int main() { std::ifstream file("student.json"); nlohmann::json data; file >> data; // Đọc và tự động phân tích cú pháp (parse) toàn bộ nội dung file
std::string name = data["name"]; int age = data["age"]; double gpa = data["gpa"];
std::cout << name << ", " << age << " tuoi, GPA " << gpa << std::endl;
for (const auto& course : data["courses"]) { std::cout << course << std::endl; }
return 0;}JSON lồng nhau (nested)
Phần tiêu đề “JSON lồng nhau (nested)”#include <nlohmann/json.hpp>#include <iostream>
int main() { nlohmann::json data; data["student"]["name"] = "Bob"; data["student"]["address"]["city"] = "Ha Noi";
std::cout << data.dump(2) << std::endl; /* { "student": { "name": "Bob", "address": { "city": "Ha Noi" } } } */
return 0;}Xử lý khi khóa không tồn tại
Phần tiêu đề “Xử lý khi khóa không tồn tại”#include <nlohmann/json.hpp>#include <iostream>
int main() { nlohmann::json data = {{"name", "Alice"}};
if (data.contains("age")) { std::cout << data["age"] << std::endl; } else { std::cout << "Khong co truong 'age'" << std::endl; }
// .value() cho phép cung cấp giá trị mặc định nếu khóa không tồn tại int age = data.value("age", 0); // Trả về 0 nếu "age" không có std::cout << age << std::endl;
return 0;}Vì sao cần thư viện bên thứ ba?
Phần tiêu đề “Vì sao cần thư viện bên thứ ba?”Triết lý thiết kế của C++ là “không trả tiền cho thứ bạn không dùng” (zero-overhead principle) - thư viện chuẩn chỉ bao gồm những gì thực sự cần thiết cho phần lớn chương trình, còn lại được cung cấp qua các thư viện chuyên biệt do cộng đồng phát triển.
Tổng kết
Phần tiêu đề “Tổng kết”- Thư viện chuẩn C++ không có module xử lý JSON sẵn có - cần dùng thư viện bên thứ ba như nlohmann/json
nlohmann::jsoncho phép thao tác với JSON gần giống như thao tác với một container thông thường.dump(n)chuyển đối tượng JSON thành chuỗi có định dạng đẹp với thụt lềnkhoảng trắng- Dùng
.contains()hoặc.value(khóa, mặc_định)để xử lý an toàn khi khóa có thể không tồn tại