Конвертирайте 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.

