تحويل JSON إلى XML Java باستخدام Gson و JAXB
⚡ ملخص ذكي
تحويل JSON إلى XML Java باستخدام Gson و JAXB بواسطة mapping كلا التنسيقين على نفس الملف المشروح Java الفئات. تحدد هذه المقالة كل تنسيق، وتُعد المشروع، وتفك تشفير XML باستخدام JAXB، وتكتب JSON باستخدام Gson، وتعكس العملية بأكملها.

ما هو JSON؟
JSON هو اختصار لـ Javaتُعدّ صيغة JSON تنسيق بيانات يتبع قواعد يمكن لمعظم لغات البرمجة قراءتها. ويمكننا بسهولة حفظها في ملف أو تخزينها في قاعدة بيانات. وتستخدم هذه الصيغة أزواج المفاتيح والقيم لوصف البيانات.
في المثال التالي، نحدد سلسلة JSON التي تخزن المعلومات الشخصية:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
لذا، فإن بنية JSON بسيطة للغاية. يتكون كل عنصر من البيانات من جزأين: مفتاح وقيمة، وهما يمثلان اسم الحقل وقيمته في السجل. وبالنظر إلى التفاصيل، نجد بعض القواعد، مثل:
- سلسلة JSON محاطة بأقواس متعرجة {}.
- يجب وضع مفاتيح JSON بين علامتي اقتباس مزدوجتين، ويجب وضع قيم السلسلة بين علامتي اقتباس أيضًا.
- إذا كانت هناك بيانات أكثر (المزيد من أزواج المفتاح => القيمة)، فإننا نستخدم الفواصل (,) لفصلها.
- يجب أن تستخدم مفاتيح JSON أحرفًا عادية أو أرقامًا أو رمز الشرطة السفلية، بدون مسافات، ويجب ألا يكون الحرف الأول رقمًا.
ما هو XML؟
XML هو اختصار لـ eXtensible Markup Language، وهو مصطلح اقترحه اتحاد شبكة الويب العالمية (W3C).https://www.w3.org/) لإنشاء لغات ترميز أخرى. هذه مجموعة فرعية بسيطة يمكنها وصف أنواع عديدة ومختلفة من البيانات، لذا فهي مفيدة للغاية لتبادل البيانات بين الأنظمة.
غالبًا لا تكون العلامات في XML محددة مسبقًا، ولكن يتم إنشاؤها وفقًا لاتفاقيات المستخدم. XML يقدم ميزات جديدة تعتمد على مزايا HTML.
توجد بعض ميزات XML المفيدة لأنظمة وحلول متنوعة:
- XML قابل للتوسيع: يسمح لك XML بإنشاء علامات مخصصة خاصة بك لتناسب تطبيقك.
- لغة XML تحمل البيانات، ولا تعرضها: تسمح لك لغة XML بتخزين البيانات بغض النظر عن كيفية عرضها.
- XML هو معيار شائع: تم تطوير XML بواسطة اتحاد شبكة الويب العالمية (W3C) وهو متاح كمعيار مفتوح.
تعتمد لغة XML على بنية عقد متداخلة. تحتوي كل عقدة على وسم فتح ووسم إغلاق كما يلي:
<node>content</node>
بحيث:
- هذا وسم مفتوح، واسم هذا الوسم تحدده أنت.
- هذا وسم إغلاق، ويجب أن يتطابق اسم هذا الوسم مع اسم وسم الفتح.
- محتوى هو محتوى هذه العلامة.
يجب عليك تعريف وسم في أعلى كل ملف XML لتحديد إصدار XML المستخدم. صيغة وسم التعليمات هي:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
JSON مقابل XML: الاختلافات الرئيسية
يحتوي كلا التنسيقين على بيانات منظمة، ويوضح الجدول أدناه سبب حاجة المشروع إلى الانتقال بينهما.
| معامل | JSON | XML |
|---|---|---|
| أسلوب بناء الجملة | أزواج المفاتيح والقيم | الوسوم المتداخلة |
| أنواع البيانات | سلسلة نصية، رقم، قيمة منطقية، قيمة فارغة، مصفوفة، كائن | نص فقط، تأتي الأنواع من مخطط |
| السمات | غير معتمد | مدعوم على أي عنصر |
| التعليقات | غير معتمد | عائلات |
| الإسهاب | مدمج | أكثر تفصيلاً لأن العلامات تتكرر |
| التحقق من صحة المخطط | مخطط JSON، اختياري | DTD و XSD ناضجان |
| الاستخدام النموذجي | واجهات برمجة تطبيقات الويب والتكوين | مراسلات ووثائق المؤسسة |
ما هو جيسون؟
جيسون (https://github.com/google/gson) هو Java مكتبة تسمح للمستخدمين بتحويل Java تحويل كائن إلى سلسلة JSON، وكذلك تحويل سلسلة JSON مرة أخرى إلى Java هدف. يمكن لـ Gson العمل بشكل تعسفي Java الكائنات، بما في ذلك الكائنات الموجودة التي لا تملك شفرة المصدر الخاصة بها.
منذ الإصدار 1.6، يقدم Gson فئتين، JsonReader و جسونWriter، لتوفير معالجة متدفقة لبيانات JSON.
- جسونWriter – الكتابة المتدفقة إلى JSON. نقوم بإنشاء جسونWriter الكائن. لبدء وإنهاء إنشاء كائن JSON، نستخدم الدوال يبدأ الكائن () و كائن النهاية (). بين هذين الاستدعاءين، نكتب البيانات على شكل أزواج (مفتاح => قيمة).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader – قراءة البيانات المتدفقة من JSON. نقوم بإنشاء كائن JsonReader. لبدء قراءة كائن JSON وإنهائها، نستخدم الدالتين beginObject() و endObject(). بين هاتين الدالتين، نقرأ البيانات على شكل أزواج (مفتاح => قيمة).
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("key")) {
String value = reader.nextString();
}
}
reader.endObject();
تتميز معالجة البيانات المتدفقة باستخدام Gson بالسرعة. ومع ذلك، ستحتاج إلى التعامل مع كل زوج (مفتاح => قيمة) من بيانات JSON بنفسك.
ما هو JAXB؟
JAXB لتقف علي Java Archiحماية لـ XML Binding، وهي مكتبة تستخدم التعليقات التوضيحية للتحويل Java تحويل الكائنات إلى محتوى XML والعكس صحيح. وبما أن JAXB مُعرَّف بمواصفات، فيمكننا استخدام تطبيقات مختلفة لهذا المعيار.
مع JAXB، نستخدم غالبًا التعليقات التوضيحية الأساسية التالية:
- @XmlRootElement: يحدد هذا التعليق الوسم الخارجي لملف XML، وبالتالي يتم الإعلان عنه فوق فئة.
- @XmlElementWrapper: يقوم هذا التعليق التوضيحي بإنشاء عنصر XML مجمّع حول المجموعات.
- تضمين التغريدة: يشير هذا التعليق التوضيحي إلى أن خاصية الكائن تصبح علامة فرعية لملف XML.
- @XmlAttribute: يشير هذا التعليق التوضيحي إلى أن خاصية الكائن تصبح سمة على الوسم المحيط.
التنفيذ العام يكون كما يلي. أولاً، نقوم بتهيئة JAXBContext كائن مع MyObject الفئة المراد تحويلها.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
هذه JAXBContext يحتوي الكائن على طريقة تقوم بإنشاء كائن يقوم بتحويل محتوى XML إلى Java الشيء، الـ غير منظم.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
نفس الشيء JAXBContext يحتوي الكائن أيضًا على طريقة تقوم بإنشاء الكائن الذي يحول Java تحويل الكائن إلى محتوى XML، مارشال.
Marshaller marshallerObj = jaxbContext.createMarshaller();
⚠️ تحذير: تمت إزالة JAXB من JDK في Java 11. على Java في الإصدار 11 والإصدارات اللاحقة، أضف واجهة برمجة التطبيقات (API) وتنفيذ وقت التشغيل إلى المشروع بشكل صريح، على سبيل المثال jakarta.xml.bind:jakarta.xml.bind-api مع org.glassfish.jaxb:jaxb-runtimeثم استورد التعليقات التوضيحية من jakarta.xml.bind.annotation بدلا من javax.xml.bind.annotation.
كيفية تحويل XML إلى JSON؟
نُطبّق مثال تحويل XML إلى JSON على المنصة التالية. الإصدارات المذكورة أدناه هي المستخدمة في لقطات الشاشة. الإصدارات الأحدث من JDK، Eclipseوتعمل مكتبة Gson بنفس الطريقة، مع مراعاة ملاحظة JAXB المذكورة أعلاه.
- OpenJDK 8 لـ Ubuntu 18.04 x64.
- Eclipse إيد 2019-03 (4.11.0) x64 Java تطوير ل Ubuntu.
- جيسون 2.8.5.
الخطوة 1) إنشاء مشروع.
إنشاء جديد Java مشروع.
الخطوة 2) حدد اسم المشروع.
قم بتعيين اسم المشروع إلى XmlToJsonExample.
الخطوة 3) قم بإنشاء مجلد.
أنشئ المجلد إدخال بيانات يحتوي على الملفين Sample.xml و عينة. json.
لنبدأ أولاً بتعريف ملف XML الخاص بنا باستخدام قسم, دورو شخص خصائص.
الهيكل العام هو: قسم واحد له أدوار متعددة، ودور واحد له أشخاص متعددون. يوضح الرسم البياني أدناه هذه العلاقات.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <department> <roles> <role id="1"> <position>head</position> <salary>10k</salary> </role> <role id="2"> <position>manager</position> <salary>8k</salary> </role> <role id="3"> <position>employee</position> <salary>5k</salary> </role> </roles> <persons> <person id="1"> <name>Red</name> <role>1</role> </person> <person id="2"> <name>Green</name> <role>2</role> </person> <person id="3"> <name>Blue</name> <role>2</role> </person> <person id="4"> <name>Yellow</name> <role>3</role> </person> <person id="5"> <name>Brown</name> <role>3</role> </person> </persons> </department> </root>
ثانيًا، نُعرّف ملف JSON الذي يُعبّر عن الفكرة نفسها. لاحظ أن قائمة الأشخاص المُسطّحة تُصبح مصفوفة مُتداخلة داخل كل دور، وهو بالضبط التحويل الذي يُجريه رمز التحويل.
{
"roles": [
{
"id": "1",
"position": "head",
"salary": "10k",
"persons": [
{
"id": "1",
"name": "Red"
}
]
},
{
"id": "2",
"position": "manager",
"salary": "8k",
"persons": [
{
"id": "2",
"name": "Green"
},
{
"id": "3",
"name": "Blue"
}
]
},
{
"id": "3",
"position": "employee",
"salary": "5k",
"persons": [
{
"id": "4",
"name": "Yellow"
},
{
"id": "5",
"name": "Brown"
}
]
}
]
}
الخطوة 4) تعريف الكائنات.
حدد فئات الكائنات المقابلة في الحزمة نموذج.
Role.java
@XmlRootElement(name = "role") public class Role { private String id; private String position; private String salary; public Role() { super(); } public Role(String id, String position, String salary) { super(); this.id = id; this.position = position; this.salary = salary; } @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "position") public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } @XmlElement(name = "salary") public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } }
Person.java
@XmlRootElement(name = "person") public class Person { private String id; private String name; private String role; public Person() { super(); } public Person(String id, String name, String role) { super(); this.id = id; this.name = name; this.role = role; } @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "role") public String getRole() { return role; } public void setRole(String role) { this.role = role; } }
Department.java
@XmlRootElement(name = "department") public class Department { private List<Role> roles; private List<Person> persons; public Department() { super(); } public Department(List<Role> roles, List<Person> persons) { super(); this.roles = roles; this.persons = persons; } @XmlElementWrapper(name = "roles") @XmlElement(name = "role") public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } @XmlElementWrapper(name = "persons") @XmlElement(name = "person") public List<Person> getPersons() { return persons; } public void setPersons(List<Person> persons) { this.persons = persons; } }
XMLModel.java
@XmlRootElement(name = "root") public class XMLModel { private Department department; public XMLModel() { super(); } public XMLModel(Department department) { super(); this.department = department; } @XmlElement(name = "department") public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
الخطوة 5) قم بإعداد المكتبة.
قم بإضافة مكتبة Gson 2.8.5 وإعدادها في Java بناء المسار.
إذا كان المشروع يستخدم مخضرم بدلاً من إضافة ملف JAR يدويًا، يتم تعريف المكتبات نفسها كاعتمادات. تم تثبيت الإصدار 2.8.5 هنا ليتوافق مع لقطات الشاشة، وأي إصدار لاحق من Gson يعمل بنفس الطريقة في هذا المثال.
<dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!-- required on Java 11 and later --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </dependency> </dependencies>
تحويل رسالة XML إلى Java الكائنات باستخدام JAXB
أولاً، نحدد الفئات التي تؤدي وظائفها في الحزمة الخدمة.
في الخطوة الأولى من العملية الأولى، نستخدم تقنية فك التشفير الخاصة بـ JAXB.
تتيح عملية فك التشفير لتطبيق العميل إمكانية تحويل بيانات XML إلى بيانات مشتقة من JAXB Java شاء.
نُعرّف الدالة getObjectFromXmlFile لإعادة تحويل ملف XML الخاص بنا إلى Java الكائن. هذه الدالة مُعرَّفة في الفئة XMLService.
public XMLModel getObjectFromXmlFile(String filePath) { try { File file = new File(filePath); JAXBContext jaxbContext = JAXBContext.newInstance(XMLModel.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); XMLModel root = (XMLModel) jaxbUnmarshaller.unmarshal(file); return root; } catch (JAXBException e) { e.printStackTrace(); return null; } }
نستدعي الكود أعلاه في الفئة XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
في هذه المرحلة، أصبح ملف XML ثلاثة ملفات Java يتم تخزين الكائنات في الذاكرة. الخطوة التالية هي كتابتها بصيغة JSON.
تحويل Java كائنات لرسالة JSON باستخدام Gson
في هذه الخطوة، نقوم بتعريف الدالة writeDataToJsonFile لكتابة البيانات إلى ملف JSON. هذه الدالة مُعرّفة في الفئة. JsonService.
لاحظ أنه لكتابة قائمة من كائنات JSON، نستخدم الدوال تبدأ الصفيف () و صفيف النهاية ()بين هذين الاستدعاءين، نقوم بكتابة كل كائن JSON.
public void writeDataToJsonFile(String filePath, List<Role> roles, List<Person> persons) { try { JsonWriter writer = new JsonWriter(new FileWriter(filePath)); writer.setIndent(" "); writer.beginObject(); writer.name("roles"); writer.beginArray(); for (Role role : roles) { writer.beginObject(); writer.name("id").value(role.getId()); writer.name("position").value(role.getPosition()); writer.name("salary").value(role.getSalary()); writer.name("persons"); writer.beginArray(); for (Person person : persons) { if (person.getRole().equalsIgnoreCase(role.getId())) { writer.beginObject(); writer.name("id").value(person.getId()); writer.name("name").value(person.getName()); writer.endObject(); } } writer.endArray(); writer.endObject(); } writer.endArray(); writer.endObject(); writer.close(); } catch (IOException e) { } }
نستدعي الكود المذكور أعلاه في الفئة XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
هذه هي العملية الأولى. تقوم الحلقة الداخلية بمطابقة كل شخص مع معرّف الدور الحالي، وهذا هو كيف تتحول قائمة الأشخاص في ملف XML المسطح إلى مصفوفة JSON متداخلة.
تحويل رسالة JSON إلى Java الكائنات باستخدام Gson
في الخطوة الأولى من العملية الثانية، نقوم بتعريف الدالة getDataFromJsonFile لقراءة البيانات من ملف JSON. هذه الدالة مُعرّفة في الفئة JsonService.
لاحظ أنه لقراءة قائمة من كائنات JSON، نستخدم الدوال تبدأ الصفيف () و صفيف النهاية (). بين هذين الاستدعاءين، نقرأ كل كائن JSON.
public void getDataFromJsonFile(String filePath, List<Role> roles, List<Person> persons) { try { JsonReader reader = new JsonReader(new FileReader(filePath)); reader.beginObject(); while (reader.hasNext()) { String nameRoot = reader.nextName(); if (nameRoot.equals("roles")) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Role role = new Role(); while (reader.hasNext()) { String nameRole = reader.nextName(); if (nameRole.equals("id")) { role.setId(reader.nextString()); } else if (nameRole.equals("position")) { role.setPosition(reader.nextString()); } else if (nameRole.equals("salary")) { role.setSalary(reader.nextString()); } else if (nameRole.equals("persons")) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Person person = new Person(); person.setRole(role.getId()); while (reader.hasNext()) { String namePerson = reader.nextName(); if (namePerson.equals("id")) { person.setId(reader.nextString()); } else if (namePerson.equals("name")) { person.setName(reader.nextString()); } } persons.add(person); reader.endObject(); } reader.endArray(); } } roles.add(role); reader.endObject(); } reader.endArray(); } } reader.endObject(); reader.close(); } catch (IOException e) { } }
نستدعي الكود المذكور أعلاه في الفئة XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
تحويل Java الكائنات إلى رسالة XML باستخدام JAXB
في هذه الخطوة، نستخدم تقنية التجميع الخاصة بـ JAXB.
تتيح عملية التنسيق لتطبيق العميل إمكانية تحويل البيانات المشتقة من JAXB Java شجرة الكائن إلى بيانات XML.
نُعرّف الدالة parseObjectToXml لحشد Java تحويل الكائن إلى رسالة XML. هذه الدالة مُعرّفة في الفئة XMLService.
public void parseObjectToXml(String filePath, XMLModel xmlModel) { try { JAXBContext contextObj = JAXBContext.newInstance(XMLModel.class); Marshaller marshallerObj = contextObj.createMarshaller(); marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshallerObj.marshal(xmlModel, new FileOutputStream(filePath)); } catch (JAXBException je) { System.out.println("JAXBException"); } catch (IOException ie) { System.out.println("IOException"); } }
نستدعي الكود المذكور أعلاه في الفئة XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = new XMLModel(); Department department = new Department(); department.setRoles(roles); department.setPersons(persons); xmlModel.setDepartment(department); xmlService.parseObjectToXml(filePathOut, xmlModel);
هذه هي العملية الثانية. يتطابق الملف المُنشأ مع الملف الأصلي sample.xml، مما يؤكد أن عملية الإرسال والاستقبال حافظت على جميع القيم.
كيفية تحويل JSON إلى XML Java بدون فئة نموذجية؟
يُعدّ النهج المذكور أعلاه الخيار الأمثل عندما يكون الهيكل معروفًا ومستقرًا، لأن الفئات المشروحة توثّق عملية الإنشاء.tract. عندما يكون الهيكل غير معروف أو يتغير بشكل متكرر، يكون المحول العام أسرع.
استخدم org.json تقوم المكتبة بإجراء التحويل في سطرين، بدون أي فئة نموذجية:
import org.json.JSONObject; import org.json.XML; public class QuickConverter { public static void main(String[] args) { String str = "{\"username\":\"guru99user\",\"email\":\"guru99user@mail.com\"}"; JSONObject json = new JSONObject(str); String xml = XML.toString(json); System.out.println(xml); } }
الإخراج:
<username>guru99user</username><email>guru99user@mail.com</email>
لاحظ أن المسار العام لا ينتج عنه عنصر جذر ولا سمات، لذلك XML.toString(json, "root") عادةً ما يكون ذلك مطلوبًا. يوضح الجدول أدناه الطريقتين جنبًا إلى جنب.
| معيار | جيسون مع جاكسب | التحويل العام لملف org.json |
|---|---|---|
| فئات النماذج المطلوبة | نعم | لا |
| التحكم في الهيكل | كامل، بما في ذلك السمات | محدود، عناصر فقط |
| ريشاping البيانات | ممكن، كما هو موضح مع الأشخاص المتداخلين | غير ممكن |
| أسطر من التعليمات البرمجية | كثير | أنظمة |
| أفضل ل | مخططات مستقرة وموثقة | هياكل مخصصة أو غير معروفة |
يقرأ JAXB بيانات XML ويكتبها Gson إلى JSON، ويستخدم المسار العكسي Gson للقراءة JSON البيانات أثناء قيام JAXB بكتابتها مرة أخرى إلى XML. لمزيد من التفاصيل، راجع XML الأساسيات، الأوسع Java البرنامج التعليميو جاسبر ريبورتس، والذي يستخدم كلا التنسيقين كمصادر لبيانات التقارير.








