JSON إلى Java

توليد كلاسات Java POJO من JSON

جرب مثالاً
اسم الكلاس الجذري:

إدخال JSON

مخرجات Java

يعمل محليًا · آمن للصق الأسرار
ستظهر كلاسات Java هنا…

ما هو تحويل JSON إلى كلاس Java؟

يأخذ تحويل JSON إلى كلاس Java كائن JSON خامًا وينتج تعريفات Plain Old Java Object (POJO) بحقول خاصة وgetters وsetters. لا يمتلك Java نظام أنواع JSON مدمجًا، لذا يحتاج كل رد من API أو ملف إعداد أو حمولة رسائل إلى كلاس مقابل قبل التعامل معه بطريقة آمنة الأنواع. تعتمد مكتبات مثل Jackson وGson على الانعكاس (reflection) لتعيين مفاتيح JSON إلى حقول Java، لكنها تتطلب وجود تعريفات الكلاسات أولًا.

يُعرّف POJO القياسي في Java المُستخدَم لتحليل JSON حقلًا خاصًا لكل مفتاح JSON، ومُنشئًا بدون معاملات، وزوجًا من getter/setter لكل حقل. تصبح كائنات JSON المتداخلة كلاسات منفصلة. تصبح المصفوفات حقول List<T> مع استيراد java.util.List. تتعيّن الأنواع الأساسية في JSON على أنواع Java الأساسية (int وdouble وboolean) أو أنواعها الغلافية (Integer وDouble وBoolean) عند استخدامها داخل الأنواع العامة. تتعيّن القيم الفارغة عادةً على Object أو نوع مرجعي قابل للإلغاء.

كتابة هذه التعريفات يدويًا عمل روتيني مضنٍ. عليك قراءة كل مفتاح JSON واستنتاج نوع Java من القيمة وتحويل أسماء المفاتيح من camelCase إلى حقول Java وإنشاء أسماء كلاسات بصيغة PascalCase للكائنات المتداخلة وإضافة كود getter/setter المتكرر. لكائن JSON بـ15 حقلًا و3 كائنات متداخلة، هذا يعني كتابة 4 كلاسات وأكثر من 30 تابعًا والحرص على الاتساق في كل شيء. يُنجز المحوّل هذا في أجزاء من الثانية.

لماذا تستخدم محوّل JSON إلى Java؟

إنشاء Java POJOs يدويًا من JSON يعني فحص كل حقل واستنتاج الأنواع من القيم النموذجية وكتابة أزواج getter/setter وتكرار العملية لكل كائن متداخل. عند تغيّر عقد الـAPI، تُحدّث كل شيء يدويًا. يُزيل المحوّل هذا العمل الميكانيكي.

توليد POJO فوري
الصق JSON واحصل على تعريفات كلاس Java كاملة في أقل من ثانية. تُكتشف الكائنات المتداخلة والقوائم والأنواع الأساسية وتُعيَّن تلقائيًا.
🔒
يعمل محليًا — بياناتك خاصة
يعمل التحويل بالكامل في متصفحك باستخدام JavaScript. لا يغادر JSON لديك جهازك. تبقى مفاتيح الـAPI والرموز المميزة وبيانات الإنتاج خاصة.
📝
استنتاج تلقائي للأنواع
كل حقل مولَّد يستخدم نوع Java المناسب المستنتج من قيمة JSON: String أو int أو double أو boolean أو List<T> أو Object للقيم الفارغة. تُستخدم الأنواع الغلافية داخل الأنواع العامة.
📦
بدون تثبيت أو تسجيل
افتح الصفحة والصق JSON. لا يتطلب JDK، ولا تبعيات Maven، ولا إنشاء حساب. يعمل على أي جهاز بمتصفح.

حالات استخدام تحويل JSON إلى Java

تطوير API بـSpring Boot
ولّد DTOs للطلبات والردود من نماذج JSON للـAPI. الصق شكل الحمولة المتوقع واحصل على كلاسات Java جاهزة لتعليقات @RequestBody و@ResponseBody في وحدات تحكم Spring.
تطوير تطبيقات Android
أنشئ كلاسات نماذج لردود شبكة Retrofit أو Volley. الصق JSON المُعاد من API الخلفي واحصل على POJOs متوافقة مع محوّلات Gson أو Moshi.
تكامل الخدمات المصغّرة
عرّف كلاسات رسائل موصوفة بالأنواع لحمولات JSON في Kafka أو RabbitMQ أو gRPC. الصق رسالة نموذجية وولّد POJOs توثّق العقد المتوقع بين الخدمات.
ترحيل الأنظمة القديمة
حوّل ردود JSON للـAPI إلى كلاسات Java عند تغليف نقاط نهاية REST في عميل موصوف بالأنواع. مفيد عند الانتقال من أنماط Map<String, Object> غير الموصوفة بالأنواع إلى نماذج مجال صحيحة.
ضمان الجودة وأتمتة الاختبار
أنشئ بيانات اختبار موصوفة بالأنواع من نماذج ردود الـAPI. يستطيع مهندسو ضمان الجودة لصق ردود JSON حقيقية وإنتاج تعريفات POJO للاستخدام في مجموعات اختبار JUnit أو TestNG مع تأكيدات AssertJ.
تعلّم أنماط OOP في Java
يستطيع الطلاب لصق أي بنية JSON ورؤية كيف تمثّلها Java بكلاسات وحقول وgetters وsetters وأنواع متداخلة. يجعل الكود المولَّد المفاهيم ملموسة بدلًا من مجردة.

جدول تعيين أنواع JSON إلى Java

كل قيمة JSON تتعيّن على نوع Java محدد. يوضح الجدول أدناه كيف يُترجم المحوّل كل نوع JSON إلى مكافئه في Java. يوضح عمود البديل الأنواع الغلافية المستخدمة في السياقات العامة مثل List<T>، أو ميزات Java الأحدث مثل Records.

نوع JSONمثالنوع Javaالبديل
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

مرجع تعليقات JSON في Java

عند تحليل JSON باستخدام Jackson أو Gson، تتحكم التعليقات (annotations) في كيفية تعيين مفاتيح JSON إلى حقول Java، ومعالجة الحقول غير المعروفة، والتعامل مع القيم الفارغة. يغطي هذا المرجع التعليقات الأكثر شيوعًا عند العمل مع POJOs المولَّدة.

التعليقالغرضالمكتبة
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO مقابل Record مقابل Lombok

تقدم Java ثلاث طرق شائعة لتعريف بنى موصوفة بالأنواع لحفظ بيانات JSON. كل طريقة تناسب أسلوب مشروع وإصدار Java مختلف. POJOs هي النمط التقليدي بأوسع توافق. Records تُقلل الكود المتكرر للبيانات غير القابلة للتغيير. Lombok يولّد getters وsetters ومُنشئات وقت الترجمة عبر التعليقات.

POJO
النمط التقليدي في Java. يعمل مع Java 8+. تُعرّف حقولًا خاصة مع توابع getter/setter. تحكم كامل في قابلية التغيير والمنطق المخصص. متوافق مع كل مكتبات JSON (Jackson وGson وMoshi). الخيار المعتمد لـSpring Boot وAndroid وقواعد الكود المؤسسية.
Record (Java 16+)
مدمج منذ Java 16 (معاينة في 14). صياغة مختصرة: record User(int id, String name) تولّد مُنشئًا ومحددي وصول (accessors) وequals وhashCode وtoString. الكائنات غير قابلة للتغيير. يدعم Jackson الـrecords منذ الإصدار 2.12. الأنسب لكائنات القيم وDTOs التي لا تحتاج إلى setters.
Lombok @Data
معالج تعليقات خارجي وقت الترجمة. يولّد @Data توابع getters وsetters وequals وhashCode وtoString. يُضيف @Builder نمط البنّاء. يُقلل الكود المتكرر إلى مستوى قريب من Records مع الإبقاء على قابلية التغيير. يتطلب إضافة Lombok إلى أداة البناء (Maven/Gradle) وتثبيت إضافة IDE.

أمثلة برمجية

تُظهر هذه الأمثلة كيفية استخدام Java POJOs المولَّدة مع Jackson للتحليل، وكيفية توليد كلاسات Java برمجيًا من JavaScript وPython، وكيفية استخدام أداة سطر أوامر jsonschema2pojo للتوليد الدُفعي.

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

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

ما الفرق بين POJO وJava Bean؟
POJO (Plain Old Java Object) هو أي كلاس Java بسيط بدون تبعيات على أي إطار عمل. Java Bean هو POJO يتبع اصطلاحات محددة: مُنشئ بدون معاملات، وحقول خاصة مع getters وsetters عامة، وتطبيق Serializable. لتعيين JSON، تتطلب معظم المكتبات اصطلاحات Bean (getters/setters) لكن لا تشترط Serializable. تتبع الكلاسات المولَّدة بهذه الأداة نمط Bean في getter/setter.
أي مكتبة JSON يجب استخدامها مع POJOs المولَّدة؟
Jackson (com.fasterxml.jackson) هي المكتبة الأكثر استخدامًا في Java والافتراضية في Spring Boot. Gson (com.google.gson) شائعة في مشاريع Android ولها API أبسط. Moshi بديل أحدث من Square مصمم للتكامل مع Kotlin. تعمل الثلاثة مع POJOs القياسية التي تمتلك getters وsetters.
كيف يتعامل المحوّل مع كائنات JSON المتداخلة؟
كل كائن متداخل يصبح كلاس Java منفصلًا. إذا كان حقل JSON المسمى "address" يحتوي على كائن بمفتاحي "street" و"city"، ينشئ المحوّل كلاس Address بتلك الحقول ويحدد نوع الحقل الأب كـAddress. تُنتج البنى المتداخلة بعمق تعريفات كلاسات متعددة.
ماذا يحدث عندما يكون حقل JSON فارغًا (null)؟
تُحدَّد الحقول الفارغة بنوع Object لأن المحوّل لا يستطيع استنتاج النوع المقصود من قيمة فارغة وحدها. عمليًا، ستستبدل Object بالنوع المتوقع (String أو Integer وغيرها) بمجرد معرفة عقد الـAPI. عند استخدام Jackson، تُعيَّن القيم الفارغة إلى حقول أنواع المرجع افتراضيًا بدون أخطاء.
هل يجب استخدام Java Records بدلًا من POJOs لـJSON؟
تعمل Records بشكل جيد لكائنات نقل البيانات غير القابلة للتغيير حيث لا تحتاج إلى setters. يدعم Jackson الـRecords منذ الإصدار 2.12، وأضاف Gson الدعم في إصدارات لاحقة. إذا كان مشروعك يعمل على Java 16+ وتتعامل مع ردود الـAPI كبيانات للقراءة فقط، تُقلل Records الكود المتكرر. إذا احتجت إلى قابلية التغيير أو استهدفت Java 8/11، التزم بـPOJOs.
كيف أتعامل مع مفاتيح JSON غير الصالحة كمعرّفات Java؟
مفاتيح JSON مثل "first-name" أو "2nd_place" ليست أسماء حقول Java صالحة. استخدم @JsonProperty("first-name") في Jackson أو @SerializedName("first-name") في Gson لتعيين مفتاح JSON إلى اسم حقل Java صالح مثل firstName. يُحوّل المحوّل تلقائيًا أسماء المفاتيح إلى حقول Java بصيغة camelCase.
هل يمكنني توليد كلاسات Java من JSON Schema بدلًا من نموذج JSON؟
تولّد هذه الأداة كلاسات من نماذج بيانات JSON. لإدخال JSON Schema، استخدم مشروع jsonschema2pojo (متاح كأداة سطر أوامر وإضافة Maven وإضافة Gradle). يقرأ ملف JSON Schema وينتج كلاسات Java موصوفة بتعليقات مع قيود التحقق والقيم الافتراضية والتوثيق من أوصاف المخطط.