العمل مع JSON في C++: تحليل البيانات وتسلسلها

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في العمل مع JSON في C++

JSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات يُستخدم على نطاق واسع في تطوير الويب وملفات التكوين وواجهات API. على الرغم من أن C++ لا يدعم JSON بشكل مدمج، إلا أن هناك العديد من المكتبات الموثوقة التي تُبسّط تحليل (parsing) البيانات وتحويلها إلى سلسلة (serialization). في هذه المقالة، سنستعرض مكتبتين شائعتين: nlohmann/json (موصى بها للمبتدئين والمشاريع الحديثة) وBoost.PropertyTree (لمن يستخدم Boost بالفعل). ستتعلم كيفية قراءة بيانات JSON وإنشائها وتعديلها وإخراجها في C++.



مكتبة nlohmann/json: التثبيت والمبادئ الأساسية

مكتبة nlohmann/json (غالباً ما تُسمى "JSON for Modern C++") هي واحدة من أشهر المكتبات بفضل بساطتها وواجهة API البديهية. وهي تدعم C++11 وما فوق، ولا تتطلب تبعيات خارجية، وتُوزّع كملف رأس واحد json.hpp.



التثبيت

قم بتنزيل الملف json.hpp من مستودع GitHub وضعه في مجلد مشروعك. ثم قم بتضمينه في الكود:

#include <iostream>#include <fstream>#include "json.hpp" // تضمين المكتبة

using json = nlohmann::json;


تحليل JSON من سلسلة وملف

تسمح المكتبة بتحليل JSON من سلسلة أو ملف أو تيار إدخال. لننظر إلى مثال لتحليل من سلسلة:

#include <iostream>#include "json.hpp"

using json = nlohmann::json;

int main() { // سلسلة JSON std::string jsonString = R"({ "name": "Alice", "age": 30, "isStudent": false, "hobbies": ["reading", "coding"] })"; // تحليل json data = json::parse(jsonString); // الوصول إلى البيانات std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "Is student: " << (data["isStudent"] ? "true" : "false") << std::endl; // التكرار عبر المصفوفة for (auto& hobby : data["hobbies"]) { std::cout << "Hobby: " << hobby << std::endl; } return 0;}

لتحليل من ملف، استخدم json::parse(std::ifstream("data.json"));.



تحويل JSON إلى سلسلة (Serialization)

إنشاء كائن JSON وتحويله إلى سلسلة يتم بطريقة طبيعية:

#include <iostream>#include "json.hpp"

using json = nlohmann::json;

int main() { json person; person["name"] = "Bob"; person["age"] = 25; person["isStudent"] = true; person["hobbies"] = {"gaming", "swimming"}; // كائن متداخل json address; address["city"] = "Moscow"; address["street"] = "Tverskaya"; person["address"] = address; // تحويل إلى سلسلة مع مسافات بادئة std::string serialized = person.dump(4); // 4 مسافات للتنسيق std::cout << serialized << std::endl; // حفظ في ملف std::ofstream file("output.json"); file << person.dump(2); file.close(); return 0;}

الطريقة dump() تحوّل الكائن إلى سلسلة. المعامل يحدد عدد المسافات للمسافات البادئة (0 — إخراج مضغوط).



مكتبة Boost.PropertyTree: نهج بديل

إذا كان مشروعك يستخدم Boost بالفعل، فإن مكتبة Boost.PropertyTree توفر طريقة ملائمة للعمل مع JSON وتنسيقات أخرى (XML, INI). وهي أقل تخصصاً لـ JSON، لكنها تتكامل جيداً مع نظام Boost البيئي.



تحليل JSON باستخدام Boost.PropertyTree

#include <iostream>#include <boost/property_tree/ptree.hpp>                

المدونات

توصيات الكتب