يعد JSON (JavaScript Object Notation) مجموعة من أزواج المفتاح والقيم التي يمكن تحليلها وإنشاؤها بسهولة من قبل التطبيقات. إنه مجموعة فرعية من معيار لغة برمجة JavaScript ECMA-262. يتطلب تحليل JSON في معظم التطبيقات، مثل واجهات برمجة التطبيقات القائمة على REST أو التطبيقات التي تحتاج إلى تسلسل البيانات.
في بيئة Java، تُعتبر مكتبتي Jackson وGson الأكثر شهرة للتعامل مع بيانات JSON. يتم استخدام كلاهما على نطاق واسع ويقدمان مزايا فريدة. يستخدم هذا المقال أمثلة حدودية لاستكشاف ميزات كلا المكتبتين على معايير مختلفة.
نبذة عن Jackson وGson
Jackson
Jackson تم تطويره بواسطة FasterXML ويستخدم في تطبيقات المؤسسات والأطر البرمجية مثل Spring Boot. يوفر تحليلًا وتسلسلًا وفك تسلسل بيانات JSON. تجعل الميزات التالية هذه المكتبة شهيرة بين المطورين:
- Jackson هو مكتبة معالجة JSON الافتراضية في Spring Boot، مما يقضي على التكوين اليدوي في معظم الحالات.
- يُيسر فك تسلسل JSON إلى أنواع عامة باستخدام TypeReference أو JavaType.
- يوفر تعليقات مختلفة لتخصيص سلوك التسلسل والفك تسلسل. على سبيل المثال،
@JsonProperty(name)
يجعل الربط بين المفتاح الوارد وحقل Java POJO الفعلي سلسًا. - يوفر دعمًا شاملاً وقويًا للربط ثنائي الاتجاه (JSON إلى POJO والعكس)، وواجهة برمجة تطبيقات التدفق (تقرأ الواجهة برمجية JSON إلى POJO)، وتحليل نموذج الشجرة (خريطة في الذاكرة الداخلية لكائنات JSON).
- تقدم مكتبة Jackson أداءً عاليًا بسبب تقليل التكاليف الزائدة للذاكرة وتحسين التسلسل/التفسيل (من JSON إلى POJO والعكس).
- تدعم Jackson وحدات إضافية مثل معالجة XML و YAML، وتعزيزات محددة لـ Kotlin و Scala.
- تتعامل التعليقات مثل
@JsonTypeInfo
و@JsonSubTypes
مع الأنواع المتعددة. - يتعامل مع الحقول المفقودة أو الإضافية في بيانات JSON بسبب توافقه العكسي والتوافق التام.
- توفر Jackson دعمًا للكائنات اللاقابلة للتغيير والفئات ذات البناة، بما في ذلك تلك التي تستخدم أنماط البناء.
- فئة
ObjectMapper
متزامنة مع الخيوط وبالتالي تمكن من استخدام فعال في تطبيقات متعددة الخيوط.
غسون
غسون تم تطويره بواسطة Google ومصمم لتحويل JSON إلى كائنات جافا (POJO) والعكس. إنه بسيط ومثالي للاستخدام في التطبيقات الأصغر التي تحتاج إلى تنفيذات سريعة. توفر المكتبة مفتوحة المصدر الميزات الرئيسية التالية:
- غسون لديه تبعيات خارجية دنيا؛ وبالتالي يسهل دمجه.
- يدعم الكائنات المتداخلة وأنواع البيانات المعقدة مثل القوائم والخرائط والفئات المخصصة.
- يمكنه تحويل JSON إلى مجموعات عامة مثل
List<T>
وMap<K,V>
باستخدام TypeToken. - تتيح واجهات JsonSerializer و JsonDeserializer في مكتبة Gson تنفيذًا مخصصًا.
- القيم الفارغة مستبعدة من مخرجات JSON بشكل افتراضي، وإذا لزم الأمر، يمكن تضمين القيم الفارغة في المخرجات.
- تقوم التعليقات التوضيحية
@SerializedName
بربط مفاتيح JSON بالحقول في Java ذات الأسماء المختلفة. - كائنات Gson آمنة للخيوط، وبالتالي يمكن استخدامها في التطبيقات متعددة الخيوط.
- يمكن لفئة GsonBuilder تطبيق سياسات تسمية مخصصة للحقول. على سبيل المثال،
FieldNamingPolicy.IDENTITY
هي السياسة الافتراضية، مما يعني أن اسم الحقل يبقى دون تغيير.
الحالات الحدية التي تم أخذها بعين الاعتبار في هذه المقارنة
Feature | Jackson | GSON |
---|---|---|
حقول إضافية |
مستبعدة بشكل افتراضي، قابلة للتكوين. |
مستبعدة بشكل افتراضي. |
القيم الفارغة |
يدعم @JsonInclude. |
يتطلب .serializeNulls(). |
المراجع الدائرية |
مدعومة باستخدام @JsonIdentityInfo. |
غير مدعومة مباشرة. |
معالجة البيانات |
يدعم Java 8 Date API مع الوحدات. |
يتطلب محولات نوع مخصصة. |
التعددية |
مدمجة مع @JsonTypeInfo. |
يحتاج إلى منطق تحليل مخصص. |
توجد بيانات JSON المدخلة التي تم اعتبارها للمقارنة مع مكتبات جاكسون وجسون على GitHub.
تمثيل فئة النموذج لـ JSON موجود على GitHub.
تنفيذ جاكسون
تم تحويل JSON أعلاه إلى كائن Java باستخدام مكتبات جاكسون أدناه:
<!-- Jackson START-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<!-- Jackson END-->
فئة تحليل JSON الرئيسية باستخدام مكتبة جاكسون:
public class JacksonJsonMain {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
//Jackson Support for LocalDate using jackson-datatype-jsr310
mapper.registerModule(new JavaTimeModule());
//Configuration to ignore extra fields
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Deserialize the JSON
EmployeeModelData employeeModelData = mapper.readValue(json, EmployeeModelData.class);
Employee employee=employeeModelData.getEmployee();
// display Json fields
System.out.println("Jackson Library parsing output");
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
System.out.println("Skills: " + employee.getSkills());
System.out.println("Team Members Count: " + employeeModelData.getTeamMembers().size());
}
}
الناتج عن الفئة أعلاه هو كما يلي:
تنفيذ جيسون
اعتماد Gson المستخدم لتحويل JSON أعلاه إلى كائن Java هو أدناه:
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
تحليل JSON باستخدام مكتبة GSON الرئيسيةالفئة:
public class GsonJsonMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // Register LocalDate adapter
.serializeNulls() // Handle null values
.setPrettyPrinting() // Pretty print JSON
.create();
// Deserialize the JSON
EmployeeModelData data = gson.fromJson(json, EmployeeModelData.class);
// Print Employee information
System.out.println("GSON Library parsing output");
System.out.println("Employee Name: " + data.getEmployee().getName());
System.out.println("Department Name: " + data.getEmployee().getDepartment().getName());
System.out.println("Skills: " + data.getEmployee().getSkills());
System.out.println("Team Members Count: " + data.getTeamMembers().size());
}
}
الناتج عن الفئة الرئيسية أعلاه هو كما يلي:
أي واحدة يجب أن أختار؟
تقدم جاكسون أداءً عالياً؛ لذلك يجب استخدامها عندما تتضمن المشاريع هياكل بيانات معقدة أو مجموعات بيانات كبيرة، في حين يجب استخدام Gson عندما تكون هناك مجموعات بيانات أصغر وهياكل بيانات بسيطة.
الختام
كلتا المكتبتين يمكنهما التعامل مع مجموعة البيانات أعلاه بفعالية وهما ممتازان أثناء معالجة تحليل JSON في جافا. يساعد المقارنة المذكورة أعلاه الشخص في اختيار المكتبة الصحيحة استنادًا إلى متطلبات المشروع.
تتوفر مقاطع الشفرة المذكورة أعلاه في مستودع GitHub.
تتوفر مقارنة مفصلة بين Jackson و Gson على Baeldung. تقدم وثائق جاكسون الرسمية معلومات مفصلة حول ميزات Jackson وتكوينه. بالمثل، توفر وثائق جسون دليل تنفيذي مفصل.
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java