مقدمة في العمل مع JSON في Java
\nJSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات يُستخدم على نطاق واسع في تطبيقات الويب الحديثة وواجهات API والخدمات المصغرة. في Java، يُعد العمل مع JSON جزءًا لا يتجزأ من التطوير: بدءًا من قراءة ملفات التكوين وصولاً إلى التفاعل مع خدمات RESTful. في هذه المقالة، سنشرح عمليًا كيفية إجراء التحليل (تحويل JSON إلى كائنات Java) والتسلسل (تحويل كائنات Java إلى JSON) باستخدام أشهر مكتبتين: Jackson و Gson.
\nسنستعرض أمثلة حقيقية على الكود، ونتعلم كيفية معالجة الهياكل المتداخلة، ونناقش الأخطاء الشائعة. بنهاية المقالة، ستكون قادرًا على العمل بثقة مع JSON في أي مشروع Java.
\n\n1. المكتبات الأساسية للعمل مع JSON
\nJackson مقابل Gson: أيهما تختار؟
\nتوجد عدة مكتبات للعمل مع JSON في Java، لكن اثنتين منها أصبحتا المعيار الفعلي:
\n- \n
- Jackson — مكتبة أكثر أداءً ووظائفًا. تدعم التعليقات التوضيحية والمعالجة التدفقية والمُسلسِلات المخصصة. يُوصى بها للمشاريع المؤسسية. \n
- Gson — مكتبة بسيطة وخفيفة من Google. مثالية للمشاريع الصغيرة والنمذجة السريعة. \n
لتضمين أي منهما، يكفي إضافة التبعية في ملف pom.xml (Maven) أو build.gradle (Gradle).
تضمين Jackson (Maven)
\n<dependency>\n <groupId>com.fasterxml.jackson.core</groupId>\n <artifactId>jackson-databind</artifactId>\n <version>2.15.2</version>\n</dependency>\n\nتضمين Gson (Maven)
\n<dependency>\n <groupId>com.google.code.gson</groupId>\n <artifactId>gson</artifactId>\n <version>2.10.1</version>\n</dependency>\n\n2. تحليل JSON: من سلسلة نصية إلى كائن Java
\nالتحليل هو عملية تحويل سلسلة JSON إلى كائن Java. سنستعرض كلا الأسلوبين باستخدام فئة User البسيطة كمثال.
إنشاء نموذج البيانات
\npublic class User {\n private String name;\n private int age;\n private String email;\n\n // يجب وجود مُنشئ فارغ!\n public User() {}\n\n // دوال الوصول (Getters and Setters)\n public String getName() { return name; }\n public void setName(String name) { this.name = name; }\n public int getAge() { return age; }\n public void setAge(int age) { this.age = age; }\n public String getEmail() { return email; }\n public void setEmail(String email) { this.email = email; }\n}\n\nالتحليل باستخدام Jackson
\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\npublic class JacksonParsingExample {\n public static void main(String[] args) throws Exception {\n String json = "{\\"name\\":\\"إيفان\\",\\"age\\":30,\\"email\\":\\"ivan@example.com\\"}";\n \n ObjectMapper mapper = new ObjectMapper();\n User user = mapper.readValue(json, User.class);\n \n System.out.println("الاسم: " + user.getName());\n System.out.println("العمر: " + user.getAge());\n }\n}\n\nالتحليل باستخدام Gson
\nimport com.google.gson.Gson;\n\npublic class GsonParsingExample {\n public static void main(String[] args) {\n String json = "{\\"name\\":\\"ماريا\\",\\"age\\":25,\\"email\\":\\"maria@example.com\\"}";\n \n Gson gson = new Gson();\n User user = gson.fromJson(json, User.class);\n \n System.out.println("الاسم: " + user.getName());\n System.out.println("البريد الإلكتروني: " + user.getEmail());\n }\n}\n\n3. التسلسل: من كائن Java إلى JSON
\nالتسلسل هو العملية العكسية: نأخذ كائن Java ونحوله إلى سلسلة JSON. هذا ضروري، على سبيل المثال