Bỏ qua để đến nội dung

Đọ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.

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.

#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"]
}
#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;
}
#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;
}
#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;
}

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.

  • 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::json cho 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ề n khoả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