Chuyển đổi JSON sang XML Java sử dụng Gson và JAXB với ví dụ
JSON là gì?
JSON là viết tắt của Javascript Ký hiệu đối tượng, là một dạng dữ liệu tuân theo một quy tắc nhất định mà hầu hết các ngôn ngữ lập trình hiện nay đều có thể đọc được. Chúng ta có thể dễ dàng lưu nó vào một tệp hoặc bản ghi 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.
Theo ví dụ sau, chúng tôi đị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 thông tin dữ liệu sẽ có hai phần: key và value tương ứng với tên trường và giá trị của nó trong một bản ghi nhất định. Nhưng nhìn xa hơn, có một vài điều như thế này:
- Chuỗi JSON được bao quanh bởi dấu ngoặc nhọn {}.
- Các khóa và giá trị của JSON 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 key => value) thì ta dùng dấu phẩy (,) để phân tách.
- Khóa JSON phải là chữ cái hoặc số không dấu, _ và không có dấu cách, ký tự đầu tiên không được đặt thành số.
XML là gì?
XML là viết tắt của Ngôn ngữ đánh dấu mở rộng còn được gọi là ngôn ngữ đánh dấu mở rộng được đề xuất bởi World Wide Web Consortium (https://www.w3.org/) để tạo các ngôn ngữ đánh dấu khác. Đây là một tập con đơn giản có thể mô tả nhiều loại dữ liệu khác nhau nên rất hữu ích trong 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 tạo XML hữu ích hơn trong các hệ thống và giải pháp đa dạng:
- 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 mang dữ liệu, không hiển thị dữ liệu: XML cho phép bạn lưu trữ dữ liệu bất kể nó 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 trên cấu trúc nút lồng nhau. Mỗi nút sẽ có thẻ mở và thẻ đóng như sau:
<node>content</node>
Trong đó:
- là thẻ mở, tên thẻ này do bạn xác định.
- là thẻ đóng, tên thẻ này phải trùng với tên 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ẻ để cho biết phiên bản XML đang được sử dụng. Cú pháp của thẻ lệnh:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Gson là gì?
Gson (https://github.com/google/gson) là một thư viện java cho phép người dùng chuyển đổi từ Java đối tượng thành chuỗi JSON và cũng có thể chuyển đổi từ chuỗi JSON sang Java sự vật. Gson có thể làm việc tùy ý Java các đối tượng bao gồm các đối tượng hiện có mà bạn không có mã nguồn của chúng.
Kể từ phiên bản 1.6, Gson giới thiệu hai lớp mới – JsonReader và JsonWriter để cung cấp khả năng xử lý phát trực tuyến trên dữ liệu JSON.
- JsonWriter – Truyền phát ghi vào JSON. Cú pháp thực hiện chung như sau. Chúng tôi tạo ra một JsonWriter sự vật. Để bắt đầu và kết thúc việc tạo chuỗi JSON, chúng ta sử dụng hàm bắt đầuObject() và endObject(). Trong quá trình thực thi hai hàm này, chúng ta thực hiện ghi dữ liệu theo cặp (key => value).
JsonWriter writer = new JsonWriter(); writer.beginObject(); writer.name("key").value("value"); writer.endObject();
- JsonReader – Truyền phát dữ liệu đọc từ JSON. Cú pháp triển khai chung như sau. Chúng ta tạo một đối tượng JsonReader. Để bắt đầu và kết thúc việc tạo chuỗi JSON, chúng ta sử dụng hàm BeginObject() và endObject(). Trong quá trình thực thi hai hàm này, chúng ta thực hiện đọc dữ liệu theo cặp (key => value).
JsonReader reader = new JsonReader(); reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("key")) { String value = reader.nextString(); } } reader.endObject();
Quá trình xử lý phát trực tuyến Gson rất nhanh. Tuy nhiên, bạn cần xử lý từng cặp (khóa => giá trị) để xử lý 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 đối tượng vào nội dung XML và ngược lại. Vì JAXB được xác định thông qua đặc tả nên chúng tôi có thể sử dụng các cách triển khai khác nhau cho 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, cụ thể:
- @XmlRootEuity: Chú thích này chỉ định thẻ ngoài cùng của tệp XML là gì và do đó nó được khai báo ở đầu 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.
- @XmlEuity: Chú thích này dùng để khai báo một thuộc tính của đối tượng là một thẻ của file XML.
- @XmlAttribution: Chú thích này còn dùng để khai báo một thuộc tính của đối tượng là một thẻ của file XML.
Cú pháp thực hiện chung như sau. Đầu tiên chúng ta sẽ khởi tạo JAXBBối cảnh đối tượng với đối tượng của tôi đối tượng cần chuyển đổi.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
Với JAXBBối cảnh đối tượng, nó có một phương thức để tạo một đối tượng chuyển đổi nội dung XML thành một đối tượng Java vật, Trình sắp xếp thứ tự.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Với JAXBBối cảnh đối tượng, nó có một phương thức để tạo đối tượng chuyển đổi Java phản đối nội dung XML đó là cảnh sát trưởng.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Làm cách nào để chuyển đổi XML sang JSON?
Chúng tôi triển khai ví dụ về chuyển đổi XML – JSON trên nền tảng:
- Mở JDK 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 là 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 tin mẫu.xml và mẫu.json.
Trước tiên hãy xác định XML của chúng tôi bằng bộ, vai trò và người tài sản.
Kiến trúc chung là: ; .
<?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 tôi định nghĩa JSON có cùng ý tưởng:
{ "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) Xác định đối tượng.
Xác định 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; } }
- Sở.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à Set up thư viện Gson 2.8.5 vào Java Xây dựng đường dẫn.
Chuyển đổi thông báo XML thành Java đối tượng sử dụng JAXB
Đầu tiên, chúng tôi xác định hiệu suất được phân loại trong gói dịch vụ.
Ở bước đầu tiên của quy trình đầu tiên, chúng tôi sử dụng kỹ thuật Un-marshalling của JAXB.
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ó nguồn gốc JAXB Java các đối tượng.
Chúng tôi xác định chức năng getObjectFromXmlFile để sắp xếp lại tệp XML của chúng tôi trở lại một Java sự vật. Hàm 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 tôi gọi 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();
Sau đó chúng ta đi đến bước tiếp theo.
Chuyển đổi Java đối tượng với tin nhắn JSON bằng Gson
Ở bước này, chúng ta xác định hàm writeDataToJsonFile để ghi dữ liệu vào tệp JSON. Hàm này được định nghĩa trong lớp Dịch vụ Json.
Lưu ý rằng để viết danh sách các chuỗi JSON, chúng ta sử dụng hàm bắt đầuArray() và endArray(). Giữa hai hàm này, chúng ta viết từng chuỗi 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 tôi gọi đoạn mã trên trong lớp Dịch vụ XmlToJson.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Đó là quá trình đầu tiên.
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 tôi xác định hàm getDataFromJsonFile để đọc dữ liệu từ tệp JSON. Hàm này được định nghĩa trong lớp Dịch vụ Json.
Lưu ý rằng để đọc danh sách các chuỗi JSON, chúng ta sử dụng hàm bắt đầuArray() và endArray(). Giữa hai hàm này, chúng ta đọc từng chuỗi 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 tôi 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);
Cách chuyển đổi Json sang XML Java?
JSON sang XML in JAVA được chuyển đổi bằng cách sử dụng JSONObject json = new JSONObject(str); Sợi dây xml = XML. Nếu bạn có tệp dtd hoặc tệp xml hợp lệ thì rất dễ dàng chuyển đổi json thành xml và cả xml sang json.
Sau đó chúng ta đi đến bước tiếp theo.
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 dữ liệu có nguồn gốc 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 phân tích cú phápObjectToXm để sắp xếp lại Java phản đối thông điệp XML. Hàm này được định nghĩa trong lớp
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"); } }
Chúng tôi 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à quá trình thứ hai.
Kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu ngắn gọn một cách để JAXB có thể đọc dữ liệu XML và Gson ghi nó vào JSON. Ngược lại, chúng tôi cũng thấy cách Gson đọc JSON dữ liệu và JAXB ghi nó vào XML.