แปลง JSON เป็น XML Java ใช้ Gson และ JAXB พร้อมตัวอย่าง

JSON คืออะไร?

JSON เป็นคำย่อของ Javascript Object Notation คือรูปแบบข้อมูลที่ปฏิบัติตามกฎเกณฑ์บางประการที่ภาษาการเขียนโปรแกรมส่วนใหญ่สามารถอ่านได้ในปัจจุบัน เราสามารถบันทึกข้อมูลลงในไฟล์หรือบันทึกในฐานข้อมูลได้อย่างง่ายดาย รูปแบบ 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 คืออะไร?

ซอน (https://github.com/google/gson) เป็นไลบรารี Java ที่ให้ผู้ใช้แปลงจาก Java object เป็นสตริง JSON และยังแปลงจากสตริง JSON เป็น Java วัตถุ. Gson สามารถทำงานตามอำเภอใจได้ Java วัตถุรวมถึงวัตถุที่มีอยู่โดยที่คุณไม่มีซอร์สโค้ด

ตั้งแต่เวอร์ชัน 1.6 Gson ได้เปิดตัวคลาสใหม่สองคลาส – JsonReader และ JsonWriter เพื่อจัดให้มีการประมวลผลการสตรีมบนข้อมูล JSON

  • JsonWriter – สตรีมมิ่งเขียนไปยัง JSON ไวยากรณ์สำหรับการใช้งานทั่วไปมีดังนี้ เราสร้างก JsonWriter วัตถุ. ในการเริ่มต้นและสิ้นสุดการสร้างสตริง JSON เราใช้ฟังก์ชัน เริ่มต้นวัตถุ() และ สิ้นสุดวัตถุ(). ในระหว่างการดำเนินการทั้งสองฟังก์ชันนี้ เราจะเขียนข้อมูลด้วยคู่ (คีย์ => ค่า)
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
  • JsonReader – สตรีมมิ่งการอ่านจาก JSON ไวยากรณ์สำหรับการใช้งานทั่วไปมีดังนี้ เราสร้างวัตถุ JsonReader ในการเริ่มต้นและสิ้นสุดการสร้างสตริง JSON เราใช้ฟังก์ชัน beginningObject() และ 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 แบบ wrapper รอบคอลเล็กชัน
  • @XmlElement: คำอธิบายประกอบนี้ใช้ในการประกาศแอตทริบิวต์ของวัตถุคือแท็กของไฟล์ XML
  • @XmlAttribute: คำอธิบายประกอบนี้ยังใช้ในการประกาศแอตทริบิวต์ของวัตถุคือแท็กของไฟล์ XML

ไวยากรณ์สำหรับการใช้งานทั่วไปมีดังนี้ ขั้นแรกเราจะเริ่มต้นการ JAXBบริบท วัตถุที่มี วัตถุของฉัน วัตถุที่จะแปลง

JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);

ในการนี​​้ JAXBบริบท object แต่ก็มีวิธีการสร้างวัตถุที่แปลงเนื้อหา XML เป็น Java วัตถุ, ยกเลิกมาร์แชลเลอร์.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

ในการนี​​้ JAXBบริบท วัตถุ แต่ก็มีวิธีการสร้างวัตถุที่แปลง Java วัตถุไปยังเนื้อหา XML นั่นคือ มาร์แชลเลอร์.

Marshaller marshallerObj = jaxbContext.createMarshaller();

วิธีแปลง XML เป็น JSON?

เราใช้ตัวอย่างของการแปลง XML – JSON บนแพลตฟอร์ม:

  • เปิด JDK 8 สำหรับ Ubuntu 18.04x64.
  • Eclipse IDE 2019-03 (4.11.0) x64 Java การพัฒนาสำหรับ Ubuntu.
  • จีสัน 2.8.5

ขั้นตอน 1) สร้างโครงการ
สร้างใหม่ Java โครงการ.

สร้างใหม่ Java โครงการ.
สร้างใหม่ Java โครงการ.

ขั้นตอน 2) ตั้งชื่อโครงการ
ตั้งชื่อโครงการคือ ตัวอย่าง XmlToJson.

ตั้งชื่อโครงการ

ตั้งชื่อโครงการ

ขั้นตอน 3) สร้างโฟลเดอร์
สร้างโฟลเดอร์ ป้อนข้อมูล มีสองไฟล์ ตัวอย่าง.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) กำหนดวัตถุ
กำหนดคลาสอ็อบเจ็กต์ที่สอดคล้องกันในแพ็คเกจ แบบ.

กำหนดคลาสอ็อบเจ็กต์

กำหนดคลาสอ็อบเจ็กต์

  • บทบาท.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;
	}
}
  • บุคคล.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;
	}
}
  • แผนก.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.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();

จากนั้นเราก็ไปที่ขั้นตอนต่อไป

แปลง Java วัตถุข้อความ JSON โดยใช้ Gson

ในขั้นตอนนี้ เราจะกำหนดฟังก์ชัน เขียน DataToJsonFile เพื่อเขียนข้อมูลลงในไฟล์ JSON ฟังก์ชั่นนี้ถูกกำหนดไว้ในคลาส JsonService.

โปรดทราบว่าในการเขียนรายการสตริง JSON เราจะใช้ฟังก์ชัน startArray() และ สิ้นสุดอาร์เรย์()- ระหว่างสองฟังก์ชันนี้ เราจะเขียนสตริง 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.getDataFromJsonFile เพื่ออ่านข้อมูลจากไฟล์ JSON ฟังก์ชั่นนี้ถูกกำหนดไว้ในคลาส JsonService.

โปรดทราบว่าหากต้องการอ่านรายการสตริง JSON เราจะใช้ฟังก์ชัน startArray() และ สิ้นสุดอาร์เรย์()- ระหว่างสองฟังก์ชันนี้ เราจะอ่านสตริง 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 ตรงกันข้าม เราเห็นวิธีที่ Gson อ่านด้วย JSON data และ JAXB เขียนลงใน XML

สรุปโพสต์นี้ด้วย: