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

Създайте нов Java Проект.
Създайте нов 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 Път за изграждане.

Настройте библиотека Gson

Добавете библиотека Gson 2.8.5 в Java Път за изграждане

Добавете библиотека 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.