ما هو Jackson ولماذا هو مطلوب؟
\n\nJackson هي مكتبة قوية وعالية الأداء لجافا، مصممة لمعالجة البيانات بتنسيق JSON (JavaScript Object Notation). في تطوير تطبيقات جافا الحديثة، أصبح JSON المعيار الفعلي لتبادل البيانات بين العميل والخادم، خاصة في خدمات الويب RESTful وهندسة الخدمات المصغرة. يحل Jackson ثلاث مهام رئيسية:
\n\n- \n
- التسلسل (Serialization) — تحويل كائنات جافا إلى سلسلة JSON. \n
- إلغاء التسلسل (Deserialization) — تحويل سلسلة JSON مرة أخرى إلى كائنات جافا. \n
- التلاعب بالشجرة (Tree Model) — العمل مع JSON كهيكل شجري من العقد (JsonNode). \n
تتميز المكتبة بسرعة عمل عالية، ومرونة في التكوين، ودعم واسع للتعليقات التوضيحية. يُستخدم Jackson في عمالقة مثل Spring Framework (عبر وحدة spring-web)، وPlay Framework، والعديد من الحلول المؤسسية الأخرى. من الصعب تخيل تطوير جافا الحديث بدون Jackson، حيث يتطلب التكامل مع واجهات برمجة التطبيقات الخارجية، والعمل مع ملفات التكوين، أو تخزين البيانات في قواعد بيانات NoSQL.
\n\nتثبيت Jackson
\n\nيتكون Jackson من عدة وحدات. أهمها:
\n- \n
jackson-core— نواة المكتبة (محلل/مولد تدفقي). \n jackson-databind— وحدة التسلسل/إلغاء التسلسل (تعتمد على core و annotations). \n jackson-annotations— تعليقات توضيحية لتكوين التعيين. \n
معظم المهام تكفيها إضافة jackson-databind، حيث أنه يسحب الوحدات الأخرى بشكل تلقائي.
التثبيت عبر Maven
\nأضف إلى ملف pom.xml:
<dependency>\n <groupId>com.fasterxml.jackson.core</groupId>\n <artifactId>jackson-databind</artifactId>\n <version>2.17.1</version> <!-- تحقق من أحدث إصدار على Maven Central -->\n</dependency>\n\nالتثبيت عبر Gradle
\nأضف إلى ملف build.gradle:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1'\n\nالتثبيت عبر pip؟ لا، هذه جافا!
\nملاحظة مهمة: Jackson هي مكتبة لجافا، وليست لبايثون. في بايثون، النظير هو الوحدة القياسية json أو مكتبة simplejson. بالنسبة لجافا، يتم التثبيت عبر أنظمة إدارة التبعيات (Maven، Gradle) أو عن طريق تنزيل ملفات JAR من الموقع الرسمي.
بداية سريعة: المثال الأول
\n\nلنقم بإنشاء فئة جافا بسيطة ونتعلم تحويلها إلى JSON والعكس.
\n\nالخطوة 1: إنشاء فئة النموذج
\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\npublic class User {\n private String name;\n private int age;\n private String email;\n\n // يجب وجود مُنشئ افتراضي!\n public User() {}\n\n public User(String name, int age, String email) {\n this.name = name;\n this.age = age;\n this.email = email;\n }\n\n // دوال الحصول (Getters) والإعداد (Setters) إلزامية لـ Jackson\n public String getName() { return name; }\n public void setName(String name) { this.name = name; }\n\n public int getAge() { return age; }\n public void setAge(int age) { this.age = age; }\n\n public String getEmail() { return email; }\n public void setEmail(String email) { this.email = email; }\n}\n\nالخطوة 2: التسلسل وإلغاء التسلسل
\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\npublic class Main {\n public static void main(String[] args) throws Exception {\n // إنشاء الكائن الرئيسي للمكتبة\n ObjectMapper mapper = new ObjectMapper();\n\n // إنشاء كائن جافا\n User user = new User("إيفان بيتروف", 30, "ivan@example.co