معالجة JSON في C++: المكتبات، التحليل والأمثلة
JSON (JavaScript Object Notation) هو أحد أشهر تنسيقات تبادل البيانات. على الرغم من أن C++ لا يحتوي على دعم مدمج لـ JSON، إلا أن هناك العديد من المكتبات القوية التي تتيح تحليل وتوليد وتعديل بيانات JSON بسهولة. في هذه المقالة، سنستعرض ثلاث مكتبات رئيسية: nlohmann/json، RapidJSON و Boost.PropertyTree، وسنقدم أمثلة عملية لاستخدامها.
لماذا نحتاج مكتبة JSON في C++؟
C++ هي لغة مُجمَّعة موجهة نحو الأداء. التحليل اليدوي لـ JSON باستخدام التعبيرات المنتظمة أو عمليات السلاسل النصية مهمة شاقة وعرضة للأخطاء. توفر المكتبات المتخصصة:
- سرعة عالية في التحليل والتسلسل.
- واجهة برمجة تطبيقات بديهية (غالباً بأسلوب STL).
- دعم معايير JSON (بما في ذلك الكائنات المتداخلة، المصفوفات، null، Unicode).
- الحد الأدنى من التبعيات (غالباً header-only).
1. مكتبة nlohmann/json (JSON for Modern C++)
المكتبة الأكثر شهرة وسهولة في الاستخدام. يتم توزيعها كـ header-only (ملف رأس واحد). مثالية للمشاريع التعليمية والتطبيقات الصغيرة.
التثبيت
قم بتنزيل الملف json.hpp من المستودع nlohmann/json وقم بتضمينه:
#include "json.hpp"using json = nlohmann::json;مثال: تحليل JSON من سلسلة نصية
#include <iostream>#include "json.hpp"
int main() { std::string json_str = R"({ "name": "PythonLib", "year": 2025, "tags": ["C++", "JSON", "education"], "active": true })";
json data = json::parse(json_str);
std::cout << "Name: " << data["name"] << ""; std::cout << "Year: " << data["year"] << ""; std::cout << "First tag: " << data["tags"][0] << ""; std::cout << "Active: " << data["active"] << "";
return 0;}مثال: إنشاء وتسلسل JSON
#include <iostream>#include "json.hpp"
int main() { json obj; obj["title"] = "JSON in C++"; obj["pages"] = 42; obj["chapters"] = {"intro", "basics", "advanced"}; obj["metadata"]["author"] = "PythonLib Team";
std::string serialized = obj.dump(4); // 4 — مسافة بادئة للإخراج الجميل std::cout << serialized << "";
return 0;}2. مكتبة RapidJSON
RapidJSON هي مكتبة عالية الأداء، موجهة نحو السرعة والاستهلاك الأدنى للذاكرة. تُستخدم غالباً في الألعاب، تطبيقات الخادم والأنظمة المدمجة. تدعم نمط SAX (التحليل التدفقي) ونمط DOM.
التثبيت
قم بتنزيل الأرشيف من GitHub وقم بتضمين ملفات الرأس:
#include "rapidjson/document.h"#include "rapidjson/writer.h"#include "rapidjson/stringbuffer.h"مثال: التحليل والقراءة
#include <iostream>#include "rapidjson/document.h"
int main() { const char* json = "{\\"project\\":\\"PythonLib\\",\\"version\\":2.0}"; rapidjson::Document doc; doc.Parse(json);
if (doc.HasParseError()) { std::cerr << "Parse error!"; return 1; }
std::cout << "Project: " << doc["project"].GetString() << ""; std::cout << "Version: " << doc["version"].GetDouble() << "";
return 0;}مثال: توليد JSON
#include <iostream>#include "rapidjson/docume