Конвертирайте JSON в XML Java използвайки Gson и JAXB с Пример
Какво е JSON?
JSON е съкращение от Javascript Обектна нотация, която е форма на данни, която следва определено правило, че повечето езици за програмиране в момента са четими. Можем лесно да го запазим във файл или запис в базата данни. Форматът JSON използва двойки ключ-стойност за описание на данни.
Следвайки примера, ние дефинираме JSON низ, който съхранява лична информация:
{ "username" : "guru99user", "email" : "guru99user@mail.com" }
Така че синтаксисът на JSON е много прост. Всяка информация за данни ще има две части: ключ и стойност, които съответстват на името на полето и неговата стойност в определен запис. Но като погледнем по-нататък, има няколко неща като това:
- JSON низът е ограден с фигурни скоби {}.
- Ключовете и стойностите на JSON трябва да бъдат оградени в кавички {“}.
- Ако има повече данни (повече двойки ключ => стойност), използваме запетаи (,) за разделяне.
- JSON ключовете трябва да са неподписани букви или цифри, _ и без интервали, първият знак не трябва да бъде зададен на числа.
Какво е XML?
XML означава eXtensible Markup Language, наричан още разширяем език за маркиране, предложен от World Wide Web Consortium (https://www.w3.org/), за да създадете други езици за маркиране. Това е просто подмножество, което може да опише много различни типове данни, така че е много полезно при споделяне на данни между системи.
Етикетите в XML често не са предварително дефинирани, но се създават според потребителските конвенции. XML въвежда нови функции, базирани на предимствата на HTML.
Има някои по-полезни функции за създаване на XML в различни системи и решения:
- XML е разширяем: XML ви позволява да създавате свои собствени персонализирани тагове, които да отговарят на вашето приложение.
- XML пренася данни, а не ги показва: XML ви позволява да съхранявате данни, независимо от това как ще бъдат показани.
- XML е общ стандарт: XML е разработен от World Wide Web Consortium (W3C) и се предлага като отворен стандарт.
XML е изграден върху структура на вложен възел. Всеки възел ще има отварящ таг и затварящ таг, както следва:
<node>content</node>
В който:
- е отворен таг, името на този таг се определя от вас.
- е затворен таг, името на този таг трябва да съвпада с името на отворения таг.
- съдържание е съдържанието на този етикет.
В горната част на всеки XML файл трябва да декларирате етикет, за да посочите използваната версия на XML. Синтаксисът на етикета с инструкции:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Какво е Gson?
Gson (https://github.com/google/gson) е библиотека на Java, която позволява на потребителите да конвертират от a Java обект към JSON низ и също така конвертиране от JSON низ към Java обект. Gson може да работи с произволни Java обекти, включително съществуващи обекти, без да имате техния изходен код.
От версия 1.6 Gson въвежда два нови класа – JsonReader намлява JsonWriter за осигуряване на поточна обработка на JSON данни.
- JsonWriter – Поточно записване в JSON. Синтаксисът за обща реализация е както следва. Ние създаваме a JsonWriter обект. За да започнем и завършим създаването на JSON низ, използваме функцията beginObject() намлява endObject(). По средата на изпълнението на тези две функции извършваме запис на данни с двойки (ключ => стойност).
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 Architecture за XML Binding, която е библиотека, която използва анотации за конвертиране Java обекти към XML съдържание и обратно. Тъй като JAXB се дефинира чрез спецификация, можем да използваме различни реализации за този стандарт.
С JAXB често използваме следните основни анотации, а именно:
- @XmlRootElement: Тази анотация указва какъв е най-външният таг на XML файла и следователно той се декларира над клас.
- @XmlElementWrapper: Тази анотация създава обвиващ XML елемент около колекциите.
- @XmlElement: Тази анотация, използвана за деклариране на атрибут на обекта, е таг на XML файла.
- @XmlAttribute: Тази анотация, използвана също за деклариране на атрибут на обекта, е таг на XML файла.
Синтаксисът за обща реализация е както следва. Първо ще инициализираме JAXBCонтекст обект с MyObject обект за преобразуване.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
В този JAXBCонтекст обект, той има метод за създаване на обект, който преобразува XML съдържание в a Java обект, Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
В този JAXBCонтекст обект, той има метод за създаване на обект, който преобразува Java обект срещу XML съдържанието, което е Маршалър.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Как да конвертирате XML в JSON?
Ние прилагаме примера за конвертиране на XML – JSON на платформата:
- Отворете JDK 8 за Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Развитие за Ubuntu.
- Gson 2.8.5.
Стъпка 1) Създайте проект.
Създайте нов Java Проект.
Стъпка 2) Задайте име на проекта.
Задайте името на проекта е XmlToJsonExample.
Стъпка 3) Създайте папка.
Създаване на папка данни/вход съдържащ два файла sample.xml намлява sample.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) Определете обект.
Дефинирайте съответните класове обекти в пакета модел.
- Роля.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 Път за изграждане.
Конвертиране на XML съобщение в Java обекти, използващи JAXB
Първо, ние определяме изпълнението, класифицирано в пакет обслужване.
В първата стъпка от първия процес използваме техника Un-marshalling на JAXB.
Un-marshalling предоставя на клиентско приложение способността да преобразува XML данни в получени от JAXB Java обекти.
Дефинираме функция getObjectFromXmlFile за демаршалиране на нашия XML файл обратно към a 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();
След това преминаваме към следващата стъпка.
Превръщам Java обекти към JSON съобщение с помощта на Gson
На тази стъпка дефинираме функция writeDataToJsonFile за запис на данни в JSON файла. Тази функция е дефинирана в клас JsonService.
Имайте предвид, че за да напишем списък с JSON низове, ние използваме функцията beginArray() намлява endArray(). Между тези две функции ние записваме всеки 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);
Това е първият процес.
Конвертиране на JSON съобщение в Java обекти, използващи Gson
На първата стъпка от втория процес дефинираме функция getDataFromJsonFile за четене на данни от JSON файл. Тази функция е дефинирана в клас JsonService.
Имайте предвид, че за да прочетем списък с JSON низове, използваме функцията beginArray() намлява endArray(). Между тези две функции ние четем всеки 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);
Как да конвертирате Json в XML Java?
JSON към XML in JAVA се преобразува с помощта на JSONObject json = new JSONObject(str); низ xml = XML. Ако имате валиден dtd файл или xml файл, тогава е много лесно да трансформирате json в xml, а също и xml в json.
След това преминаваме към следващата стъпка.
Превръщам Java обекти към XML съобщение с помощта на JAXB
На тази стъпка използваме техника Marshalling на JAXB.
Marshalling предоставя на клиентско приложение способността да преобразува получен JAXB Java дърво на обекти в XML данни.
Ние дефинираме функцията parseObjectToXm за marshall 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);
Това е вторият процес.
Заключение
В този урок накратко научихме един начин, по който JAXB може да чете XML данни, а Gson да ги записва в JSON. Напротив, видяхме и начина, по който Гсон чете JSON данни и JAXB го записват в XML.