Chuyển đổi JSON sang XML Java sử dụng Gson và JAXB
⚡ Tóm tắt thông minh
Chuyển đổi JSON sang XML Java Sử dụng Gson và JAXB bằng mapping cả hai định dạng trên cùng một chú thích Java Bài viết này định nghĩa từng định dạng, thiết lập dự án, giải mã XML bằng JAXB, ghi JSON bằng Gson và đảo ngược toàn bộ quy trình.

JSON là gì?
JSON là viết tắt của JavaScript Object Notation (SNOW) là một định dạng dữ liệu tuân theo các quy tắc mà hầu hết các ngôn ngữ lập trình đều có thể đọc được. Chúng ta có thể dễ dàng lưu nó vào một tập tin hoặc lưu trữ trong cơ sở dữ liệu. Định dạng JSON sử dụng các cặp khóa-giá trị để mô tả dữ liệu.
Trong ví dụ sau, chúng ta định nghĩa một chuỗi JSON lưu trữ thông tin cá nhân:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
Vì vậy, cú pháp của JSON rất đơn giản. Mỗi mục dữ liệu có hai phần, khóa và giá trị, tương ứng với tên trường và giá trị của nó trong một bản ghi. Xét kỹ hơn, có một vài quy tắc như sau:
- Chuỗi JSON được bao quanh bởi dấu ngoặc nhọn {}.
- Các khóa trong JSON phải được đặt trong dấu ngoặc kép, và các giá trị chuỗi cũng phải được đặt trong dấu ngoặc kép.
- Nếu có nhiều dữ liệu hơn (nhiều cặp khóa => giá trị hơn), chúng ta sử dụng dấu phẩy (,) để phân tách chúng.
- Khóa JSON phải sử dụng các chữ cái, số hoặc ký tự gạch dưới, không có khoảng trắng, và ký tự đầu tiên không được là số.
XML là gì?
XML là viết tắt của eXtensible Markup Language, được đề xuất bởi Hiệp hội World Wide Web (https://www.w3.org/) để tạo ra các ngôn ngữ đánh dấu khác. Đây là một tập hợp con đơn giản có thể mô tả nhiều loại dữ liệu khác nhau, vì vậy nó rất hữu ích cho việc chia sẻ dữ liệu giữa các hệ thống.
Các thẻ trong XML thường không được xác định trước mà chúng được tạo theo quy ước của người dùng. XML giới thiệu các tính năng mới dựa trên những ưu điểm của HTML.
Có một số tính năng XML hữu ích cho nhiều hệ thống và giải pháp khác nhau:
- XML có thể mở rộng: XML cho phép bạn tạo các thẻ tùy chỉnh của riêng mình để phù hợp với ứng dụng của bạn.
- XML dùng để truyền tải dữ liệu, chứ không phải hiển thị dữ liệu: XML cho phép bạn lưu trữ dữ liệu bất kể dữ liệu đó sẽ được hiển thị như thế nào.
- XML là một tiêu chuẩn chung: XML được World Wide Web Consortium (W3C) phát triển và có sẵn dưới dạng tiêu chuẩn mở.
XML được xây dựng dựa trên cấu trúc nút lồng nhau. Mỗi nút có một thẻ mở và một thẻ đóng như sau:
<node>content</node>
Trong đó:
- Đây là một thẻ mở, và tên của thẻ này do bạn tự định nghĩa.
- Đây là thẻ đóng, và tên của thẻ này phải trùng với tên của thẻ mở.
- nội dung là nội dung của thẻ này.
Ở đầu mỗi tệp XML, bạn phải khai báo một thẻ để chỉ ra phiên bản XML đang được sử dụng. Cú pháp của thẻ chỉ thị như sau:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
JSON so với XML: Những điểm khác biệt chính
Cả hai định dạng đều chứa dữ liệu có cấu trúc, và bảng dưới đây cho thấy lý do tại sao một dự án có thể cần chuyển đổi giữa chúng.
| Tham số | JSON | XML |
|---|---|---|
| Kiểu cú pháp | Cặp khóa và giá trị | Thẻ lồng nhau |
| Loại dữ liệu | Chuỗi, số, boolean, null, mảng, đối tượng | Chỉ có văn bản, các kiểu dữ liệu được lấy từ lược đồ. |
| Thuộc tính | Không được hỗ trợ | Được hỗ trợ trên mọi thành phần |
| Nhận xét | Không được hỗ trợ | Hỗ trợ |
| Độ dài | gọn nhẹ | Dài dòng hơn vì các thẻ lặp lại |
| Xác thực lược đồ | Lược đồ JSON, tùy chọn | DTD và XSD, đã trưởng thành |
| Sử dụng điển hình | API web và cấu hình | Hệ thống nhắn tin và tài liệu doanh nghiệp |
Gson là gì?
Gson (https://github.com/google/gson) Là một Java thư viện cho phép người dùng chuyển đổi một Java Chuyển đổi đối tượng thành chuỗi JSON, và cũng chuyển đổi chuỗi JSON trở lại thành đối tượng. Java sự vật. Gson có thể làm việc tùy ý Java các đối tượng, bao gồm cả các đối tượng hiện có mà bạn không có mã nguồn.
Từ phiên bản 1.6 trở đi, Gson giới thiệu hai lớp, JsonReader và jsonWriterĐể cung cấp khả năng xử lý dữ liệu JSON theo luồng.
- jsonWriter – Ghi dữ liệu trực tuyến vào JSON. Chúng tôi tạo ra một jsonWriter Để bắt đầu và kết thúc việc tạo một đối tượng JSON, chúng ta sử dụng các hàm. bắt đầuObject() và endObject()Giữa hai lần gọi đó, chúng ta ghi dữ liệu dưới dạng các cặp (khóa => giá trị).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader – Đọc dữ liệu trực tuyến từ JSON. Chúng ta tạo một đối tượng JsonReader. Để bắt đầu và kết thúc việc đọc một đối tượng JSON, chúng ta sử dụng các hàm beginObject() và endObject(). Giữa hai lần gọi đó, chúng ta đọc dữ liệu theo cặp (khóa => giá trị).
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("key")) {
String value = reader.nextString();
}
}
reader.endObject();
Xử lý dữ liệu theo luồng của Gson rất nhanh. Tuy nhiên, bạn cần tự xử lý từng cặp (khóa => giá trị) dữ liệu JSON.
JAXB là gì?
JAXB là viết tắt của Java Archikiến trúc cho XML Binding, là một thư viện sử dụng các chú thích để chuyển đổi Java Chuyển đổi đối tượng thành nội dung XML và ngược lại. Vì JAXB được định nghĩa bởi một đặc tả kỹ thuật, chúng ta có thể sử dụng các triển khai khác nhau của tiêu chuẩn này.
Với JAXB, chúng ta thường sử dụng các chú thích cơ bản sau:
- @XmlRootEuityChú thích này chỉ định thẻ ngoài cùng của tệp XML, do đó nó được khai báo ở trên một lớp.
- @XmlElementWrapper: Chú thích này tạo phần tử XML bao bọc xung quanh các bộ sưu tập.
- @XmlEuityChú thích này khai báo rằng một thuộc tính của đối tượng trở thành thẻ con của tệp XML.
- @XmlAttributionChú thích này khai báo rằng một thuộc tính của đối tượng trở thành một thuộc tính trên thẻ bao quanh.
Quy trình thực hiện chung như sau. Đầu tiên, chúng ta khởi tạo... JAXBBối cảnh đối tượng với đối tượng của tôi lớp cần chuyển đổi.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
T JAXBBối cảnh Đối tượng này có một phương thức tạo ra một đối tượng khác, phương thức này chuyển đổi nội dung XML thành một đối tượng khác. Java vật thể, cái Trình sắp xếp thứ tự.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Như nhau JAXBBối cảnh Đối tượng này cũng có một phương thức tạo ra đối tượng đó, phương thức này chuyển đổi một Java chuyển đổi đối tượng thành nội dung XML, cảnh sát trưởng.
Marshaller marshallerObj = jaxbContext.createMarshaller();
⚠️ Cảnh báo: JAXB đã bị loại bỏ khỏi JDK vào năm... Java 11. Bật Java Từ phiên bản 11 trở lên, hãy thêm API và triển khai thời gian chạy vào dự án một cách rõ ràng, ví dụ: jakarta.xml.bind:jakarta.xml.bind-api Cùng với org.glassfish.jaxb:jaxb-runtimevà nhập các chú thích từ jakarta.xml.bind.annotation thay vì javax.xml.bind.annotation.
Làm cách nào để chuyển đổi XML sang JSON?
Chúng tôi triển khai ví dụ chuyển đổi XML sang JSON trên nền tảng sau. Các phiên bản bên dưới là những phiên bản được sử dụng cho ảnh chụp màn hình. Các bản phát hành JDK mới hơn, Eclipsevà Gson hoạt động theo cùng một cách, tuân theo ghi chú của JAXB ở trên.
- OpenJDK 8 cho Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Phát triển cho Ubuntu.
- Gson 2.8.5.
Bước 1) Tạo dự án.
Tạo một cái mới Java dự án.
Bước 2) Đặt tên dự án.
Đặt tên dự án thành Ví dụ XmlToJson.
Bước 3) Tạo một thư mục.
Tạo thư mục dữ liệu/đầu vào chứa hai tệp mẫu.xml và mẫu.json.
Trước tiên, chúng ta hãy định nghĩa XML của mình bằng bộ, vai tròvà người tài sản.
Cấu trúc tổng thể như sau: một phòng ban có nhiều vai trò, và một vai trò có nhiều người đảm nhiệm. Sơ đồ dưới đây thể hiện các mối quan hệ đó.
<?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>
Thứ hai, chúng ta định nghĩa JSON thể hiện cùng một ý tưởng. Lưu ý rằng danh sách người dùng dạng phẳng trở thành một mảng lồng nhau bên trong mỗi vai trò, đây chính xác là phép biến đổi mà mã chuyển đổi thực hiện.
{
"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"
}
]
}
]
}
Bước 4) Định nghĩa các đối tượng.
Hãy định nghĩa các lớp đối tượng tương ứng trong gói. kiểu mẫu.
Vai trò.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; } }
Người.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; } }
Bước 5) Thiết lập thư viện.
Thêm và thiết lập thư viện Gson 2.8.5 trong... Java Xây dựng đường dẫn.
Nếu dự án sử dụng Maven Thay vì thêm thủ công file jar, các thư viện tương tự được khai báo dưới dạng các thư viện phụ thuộc. Phiên bản 2.8.5 được ghim ở đây để khớp với ảnh chụp màn hình, và bất kỳ phiên bản Gson nào sau này cũng hoạt động giống hệt như trong ví dụ này:
<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>
Chuyển đổi thông báo XML thành Java đối tượng sử dụng JAXB
Đầu tiên, chúng ta định nghĩa các lớp thực thi trong gói. dịch vụ.
Ở bước đầu tiên của quy trình đầu tiên, chúng ta sử dụng kỹ thuật giải mã dữ liệu của JAXB.
Việc giải mã (un-marshalling) cung cấp cho ứng dụng khách khả năng chuyển đổi dữ liệu XML thành dữ liệu được suy ra từ JAXB. Java các đối tượng.
Chúng tôi xác định chức năng getObjectFromXmlFile để giải mã tệp XML của chúng ta trở lại thành một Java đối tượng. Chức năng này được định nghĩa trong lớp. Dịch vụ XML.
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; } }
Chúng ta gọi đoạn mã trên trong lớp. Dịch vụ XmlToJson.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Đến thời điểm này, tệp XML đã trở thành ba phần. Java các đối tượng trong bộ nhớ. Bước tiếp theo là ghi chúng ra dưới dạng JSON.
Chuyển đổi Java đối tượng với tin nhắn JSON bằng Gson
Ở bước này, chúng ta định nghĩa hàm số. writeDataToJsonFile để ghi dữ liệu vào tệp JSON. Chức năng này được định nghĩa trong lớp. Dịch vụ Json.
Lưu ý rằng để viết danh sách các đối tượng JSON, chúng ta sử dụng các hàm. bắt đầuArray() và endArray()Giữa hai lần gọi này, chúng ta ghi từng đối tượng 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) { } }
Chúng ta gọi đoạn mã trên trong lớp. Dịch vụ XmlToJson.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Đó là quy trình đầu tiên. Vòng lặp bên trong so khớp từng người với ID vai trò hiện tại, đó là cách danh sách người dùng XML phẳng trở thành một mảng JSON lồng nhau.
Chuyển đổi tin nhắn JSON thành Java đối tượng sử dụng Gson
Ở bước đầu tiên của quy trình thứ hai, chúng ta định nghĩa hàm số. getDataFromJsonFile Để đọc dữ liệu từ tệp JSON. Chức năng này được định nghĩa trong lớp. Dịch vụ Json.
Lưu ý rằng để đọc danh sách các đối tượng JSON, chúng ta sử dụng các hàm. bắt đầuArray() và endArray()Giữa hai lần gọi này, chúng ta đọc từng đối tượng 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) { } }
Chúng ta gọi đoạn mã trên trong lớp. Dịch vụ XmlToJson.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Chuyển đổi Java đối tượng thông điệp XML bằng JAXB
Ở bước này, chúng ta sử dụng kỹ thuật marshalling của JAXB.
Marshalling cung cấp cho ứng dụng khách khả năng chuyển đổi một đối tượng được tạo ra từ JAXB. Java cây đối tượng thành dữ liệu XML.
Chúng tôi xác định chức năng parseObjectToXml để tập hợp Java chuyển đổi đối tượng thành thông báo XML. Chức năng này được định nghĩa trong lớp. Dịch vụ XML.
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"); } }
Chúng ta gọi đoạn mã trên trong lớp. Dịch vụ XmlToJson.
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);
Đó là quy trình thứ hai. Tệp được tạo ra khớp với tệp sample.xml gốc, điều này xác nhận rằng quá trình truyền tải hai chiều đã bảo toàn mọi giá trị.
Cách chuyển đổi JSON sang XML Java Không cần lớp Model?
Phương pháp trên là lựa chọn đúng đắn khi cấu trúc đã được biết và ổn định, bởi vì các lớp được chú thích ghi lại cấu trúc đó.tracKhi cấu trúc không xác định hoặc thay đổi thường xuyên, bộ chuyển đổi chung sẽ nhanh hơn.
org.json Thư viện thực hiện chuyển đổi chỉ trong hai dòng, không cần bất kỳ lớp mô hình nào:
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); } }
Đầu ra:
<username>guru99user</username><email>guru99user@mail.com</email>
Lưu ý rằng đường dẫn chung không tạo ra phần tử gốc và không có thuộc tính nào, vì vậy XML.toString(json, "root") Thông thường là cần thiết. Bảng dưới đây trình bày hai phương pháp này cạnh nhau.
| Tiêu chí | Gson với JAXB | chuyển đổi chung org.json |
|---|---|---|
| Các lớp mẫu cần thiết | Có | Không |
| Kiểm soát cấu trúc | Đầy đủ, bao gồm các thuộc tính | Giới hạn, chỉ có các yếu tố |
| Reshaping dữ liệu | Điều này hoàn toàn có thể xảy ra, như đã được chứng minh với các cá nhân lồng nhau. | Không thể |
| Dòng mã | nhiều | Hai |
| Tốt nhất cho | Các lược đồ ổn định, được ghi chép đầy đủ. | Cấu trúc ngẫu nhiên hoặc không xác định |
JAXB đọc dữ liệu XML và Gson ghi dữ liệu đó thành JSON, và chiều ngược lại sử dụng Gson để đọc. JSON dữ liệu trong khi JAXB ghi lại dữ liệu đó vào XML. Để hiểu rõ hơn, hãy xem lại XML các nguyên tắc cơ bản, phạm vi rộng hơn Java hướng dẫnvà JasperBáo cáo, sử dụng cả hai định dạng này làm nguồn dữ liệu báo cáo.








