JSON إلى فئة Java

الصق عيّنة JSON، وسيولّد المولّد فئة Java واحدة أو أكثر بأنواع الحقول الصحيحة، ودوال getter وsetter، وتعليقات مكتبة JSON. يدعم Jackson (@JsonProperty) وGson (@SerializedName) وLombok (@Data/@Builder) للحصول على كود أنظف. وتتحول الكائنات المتداخلة إلى فئات داخلية أو فئات شقيقة، بحسب التخطيط الذي تختاره.

كيفية تحويل JSON إلى Java

  1. 1

    الصق JSON

    تكفي عيّنة واحدة؛ واستخدام عدة عيّنات يحسّن تحديد ما إذا كان الحقل يقبل قيمة null.

  2. 2

    اختر المكتبة

    Jackson (الأكثر شيوعًا في Spring)، أو Gson (لأندرويد وبعض المشاريع القديمة)، أو POJO بسيط بدون تعليقات.

  3. 3

    اختر الإضافات

    Lombok لتوليد دوال getter/setter تلقائيًا، ونمط builder، وequals/hashCode. أو اتركه بسيطًا دون إضافات.

  4. 4

    اختر نمط التداخل

    فئات شقيقة في الملف نفسه (يجب أن تكون فئات public في Java 17 فما فوق في ملفات منفصلة)، أو فئات ثابتة متداخلة.

  5. 5

    انسخ الكود

    أدرِجه مباشرةً في مشروعك. تتطابق أسماء الفئات مع مفاتيح JSON، وتُضبط الحزمة وفق ما تعدّه.

مثال على المخرجات: Jackson + Lombok

المدخل:

{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }

المخرج:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @JsonProperty("firstName")
    private String firstName;

    @JsonProperty("age")
    private int age;

    @JsonProperty("address")
    private Address address;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    @JsonProperty("city")
    private String city;
}

مطابقة الأنواع

JSON نوع Java
سلسلة نصية String
عدد صحيح (≤ Integer.MAX) Integer / int
عدد صحيح كبير Long / BigInteger
عدد عشري Double / BigDecimal
قيمة منطقية Boolean / boolean
تاريخ ISO LocalDate (Jackson JSR-310)
تاريخ ووقت ISO Instant / OffsetDateTime
null (مع حقل شقيق غير فارغ) نوع مُغلِّف (مثل Integer)
مصفوفة List<T>
كائن فئة متداخلة

الاختيار بين النوع المُغلَّف والنوع الأولي

  • النوع الأولي (int، long، boolean)، لا يقبل null، وفعّال، ودون تغليف تلقائي (auto-boxing).
  • النوع المُغلَّف (Integer، Long، Boolean)، يقبل null، ومطلوب إذا كان الحقل قد يغيب أو يكون null في JSON.

يستخدم المولّد افتراضيًا النوع المُغلَّف لكل ما يُعدّ قابلًا لقيمة null، والنوع الأولي فيما عدا ذلك.

Jackson مقابل Gson

الميزة Jackson Gson
الانتشار في Spring نعم، افتراضي لا (يتطلب إعدادًا)
الأداء أسرع أبطأ
دعم تواريخ JSR-310 عبر وحدة إضافية عبر وحدة إضافية
تعدد الأشكال @JsonTypeInfo RuntimeTypeAdapter
التسامح مع الفاصلة الأخيرة لا (افتراضيًا) نعم

الأخطاء الشائعة

  • استخدام الأنواع الأولية لحقول تقبل null. لا يمكن أن يكون int فارغًا (null)؛ وسيُطلق Jackson خطأً إذا احتوى JSON على "age": null. استخدم Integer.
  • غياب وحدات التاريخ. يحتاج Jackson إلى jackson-datatype-jsr310 لـ Instant/LocalDate. وبدونها، تعود التواريخ إلى String أو إلى قيم long بتوقيت الحقبة (epoch).
  • مشاركة الأنواع المُغلَّفة بين فئات غير مترابطة. إذا احتوى شكلان من JSON على Address متداخل، فسينشئ المولّد فئتَي Address. أعِد التسمية أو وحِّدهما يدويًا.
  • نسيان @JsonIgnoreProperties(ignoreUnknown = true). يُطلق Jackson الصارم خطأً عند الخصائص غير المعروفة؛ أضِف هذا التعليق (أو اضبطه عالميًا) لإلغاء تسلسل متسامح.

الأسئلة الشائعة

Jackson في معظم الحالات، فهو الخيار الافتراضي في Spring، وأسرع، ويدعم تعدد الأشكال بشكل أوفى. أما Gson فأخف وأشهر في أندرويد، رغم أن مشاريع أندرويد باتت تعتمد بشكل متزايد على Moshi أو kotlinx.serialization.

يقلّص Lombok كثيرًا من الكود المكرر (getters وsetters وequals وhashCode وbuilder). يُستخدم على نطاق واسع، لكنه يتطلب معالج تعليقات Lombok في عملية البناء. عطّله إذا كان مشروعك يتجنب Lombok لأسباب تتعلق بنظافة الاعتماديات.

الحقول التي تكون null في أي عيّنة مرصودة تصبح أنواعًا مُغلَّفة (Integer بدلًا من int) كي تستطيع الاحتفاظ بقيمة null. عندئذٍ يُلغي Jackson تسلسل "age": null دون خطأ. أضِف @JsonInclude(Include.NON_NULL) لتخطي القيم null أثناء التسلسل.

نعم، إذا اخترت “record”. فئات record موجزة وغير قابلة للتغيير وتعمل مع Jackson 2.12+. وبالنسبة لمشاريع Spring Boot 3، فإن الجمع بين record والتوليد بدون Lombok هو الخيار الحديث.

أدوات ذات صلة

الأداة متاحة بلغات أخرى