ما هو JSON ولماذا هو مهم في Java؟
JSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات، يسهل قراءته من قبل البشر ومعالجته بواسطة البرامج. في تطوير Java الحديث، يُستخدم JSON في كل مكان: من ملفات التكوين إلى طلبات API لخدمات الويب.
يتضمن العمل مع JSON في Java عمليتين رئيسيتين:
- التسلسل — تحويل كائن Java إلى سلسلة JSON.
- التحليل (إلغاء التسلسل) — تحويل سلسلة JSON مرة أخرى إلى كائن Java.
في هذا الدرس، سنشرح كيفية تنفيذ هذه العمليات باستخدام مكتبتين شائعتين: Jackson وGson. الأمثلة مناسبة حتى للمطورين المبتدئين.
إعداد المشروع وتوصيل المكتبات
للبدء، سنحتاج إلى مشروع Java. سنستخدم Maven لإدارة التبعيات. قم بإنشاء مشروع Maven جديد وأضف التبعيات التالية في ملف pom.xml:
إضافة Jackson
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.1</version></dependency>إضافة Gson
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.11.0</version></dependency>يمكن استخدام كلتا المكتبتين معًا في نفس المشروع. بعد تحديث تبعيات Maven، سيتم تحميلها تلقائيًا.
إنشاء فئة Java للمثال
للتوضيح، سننشئ فئة بسيطة User سنقوم بتسلسلها وتحليلها:
public class User { private String name; private int age; private String email;
// يجب وجود مُنشئ فارغ لإلغاء التسلسل public User() {}
public User(String name, int age, String email) { this.name = name; this.age = age; this.email = email; }
// الدوال الحاصلة والمحددة (إلزامية لـ Jackson) public String getName() { return name; } public void setName(String name) { this.name = name; }
public int getAge() { return age; } public void setAge(int age) { this.age = age; }
public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}هام: لكي تعمل المكتبات بشكل صحيح، يجب أن تحتوي الفئة على:
- مُنشئ فارغ (بدون وسائط).
- دوال حاصلة ومحددة لجميع الحقول (إلزامي لـ Jackson، بينما لـ Gson تكفي الدوال الحاصلة).
تسلسل كائن Java إلى JSON
التسلسل هو عملية تحويل الكائن إلى سلسلة. سنستعرض كلا النهجين.
مثال مع Jackson
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); User user = new User("آنا", 25, "anna@example.com");
// التسلسل إلى سلسلة String json = mapper.writeValueAsString(user); System.out.println(json); }}نتيجة التنفيذ:
{"name":"آنا","age":25,"email":"anna@example.com"}مثال مع Gson
import com.google.gson.Gson;
public class GsonExample { public static void main(String[] args) { Gson gson = new Gson(); User user = new User("آنا", 25, "anna@example.com");
// التسلسل إلى سلسلة String json = gson.toJson(user); System.out.println(json); }}النتيجة ستكون متطابقة. كلتا المكتبتين تؤديان المهمة بنفس الجودة