معالجة JSON في C++ باستخدام مكتبة nlohmann/json
في التطوير الحديث بلغة C++، أصبح العمل مع JSON (JavaScript Object Notation) جزءًا لا يتجزأ عند إنشاء خدمات الويب وملفات التكوين وتبادل البيانات بين الأنظمة. واحدة من أشهر وأسهل المكتبات لهذه المهمة هي nlohmann/json (أو ببساطة JSON for Modern C++). تقدم واجهة برمجة تطبيقات بديهية، وبناء جملة بسيط، وأداء عالي. في هذه المقالة، سنشرح بالتفصيل كيفية استخدام هذه المكتبة لتحليل وإنشاء وتعديل وتسلسل بيانات JSON في C++.
التثبيت والتضمين
مكتبة nlohmann/json هي مكتبة header-only (تتكون فقط من ملفات الرأس). لتثبيتها، يكفي تنزيل ملف واحد json.hpp من المستودع الرسمي وتضمينه في مشروعك:
#include <nlohmann/json.hpp>using json = nlohmann::json;إذا كنت تستخدم CMake، يمكنك تضمين المكتبة عبر FetchContent أو vcpkg. مثال لـ CMake:
FetchContent_Declare(json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.2)FetchContent_MakeAvailable(json)
target_link_libraries(your_project PRIVATE nlohmann_json::nlohmann_json)الإمكانيات الأساسية للمكتبة
- تحليل JSON من سلسلة نصية أو ملف – تحويل النص إلى بيانات منظمة.
- إنشاء كائنات JSON – تكوين الهياكل ديناميكيًا باستخدام عوامل التشغيل
[]والطرق. - الوصول إلى البيانات – قراءة القيم حسب المفاتيح والفهارس مع التحقق من الأنواع.
- التسلسل – تحويل كائن JSON مرة أخرى إلى سلسلة نصية مع التنسيق.
- العمل مع المصفوفات والكائنات المتداخلة – دعم الهياكل الهرمية المعقدة.
- معالجة الأخطاء – استثناءات عند وجود بيانات أو أنواع غير صحيحة.
مثال 1: التحليل وقراءة البيانات
لنشرح مثالًا بسيطًا: لدينا سلسلة نصية تحتوي على JSON تحتوي على معلومات عن مستخدم. نقوم بتحليلها واستخراج القيم:
#include <iostream>#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() { std::string json_str = R"( { "name": "إيفان", "age": 30, "is_student": false, "hobbies": ["قراءة", "برمجة", "رياضة"] } )";
// تحليل السلسلة النصية إلى كائن json json user = json::parse(json_str);
// الوصول إلى البيانات مع التحقق من النوع std::string name = user["name"]; int age = user["age"]; bool is_student = user["is_student"];
std::cout << "الاسم: " << name << std::endl; std::cout << "العمر: " << age << std::endl; std::cout << "طالب: " << (is_student ? "نعم" : "لا") << std::endl;
// العمل مع المصفوفة auto& hobbies = user["hobbies"]; std::cout << "الهوايات: "; for (const auto& hobby : hobbies) { std::cout << hobby << " "; } std::cout << std::endl;
return 0;}مثال 2: إنشاء JSON وتسلسله
غالبًا ما يكون مطلوبًا تكوين هيكل JSON برمجيًا. الكود التالي ينشئ كائنًا يحتوي على بيانات كتاب ويخرجه بصيغة منسقة:
#include <iostream>#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() { // إنشاء كائن فارغ json book;
// ملء البيانات book["title"] = "الحرب والسلام"; book["author"] = "ليو تولستوي"; book["year"] = 1869; book["genres"] = {"رواية", "أدب تاريخي"};
// كائن متداخل book["publisher"]["name"] = "إكسمو";