Chuyển đổi dữ liệu từ định dạng XML sang định dạng JSON và ngược lại sử dụng bộ thư viện JAXB và Gson

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu kỹ thuật cơ bản trong Java chuyển đổi dữ liệu sang định dạng Json sử dụng bộ thư viện Gson và định dạng XML sử dụng bộ thư viện JAXB.

Những nội dung chính được trình bày trong bài này:

  • Giới thiệu bộ thư viện Gson.
  • Giới thiệu bộ thư viện JAXB.
  • Kỹ thuật đọc / ghi dữ liệu theo định dạng Json sử dụng bộ thư viện Gson.
  • Kỹ thuật đọc / ghi dữ liệu theo định dạng XML sử dụng bộ thư viện JAXB.

Kế hoạch thực hiện chung

Chúng ta cùng lên kế hoạch thực hiện chung cho nhóm bài này bằng MindMap như sau:

Giới thiệu bộ thư viện Gson

Gson (https://github.com/google/gson) là một bộ thư viện dành cho ngôn ngữ Java, cho phép người sử dụng chuyển đổi một đối tượng Java (lưu trữ dữ liệu) sang định dạng chuỗi Json và có thể chuyển đổi ngược lại từ một chuỗi Json sang một đối tượng Java.

Gson có thể làm việc với các đối tượng Java tùy ý bao gồm các đối tượng hiện có mà không cần có mã nguồn của chúng.

Từ phiên bản 1.6, Gson giới thiệu hai lớp xử lý mới – JsonReaderJsonWriter để cung cấp tiến trình xử lý trực tiếp trên dữ liệu Json.

  • JsonWriter – Ghi trực tiếp thành Json. Cú pháp để thực thi tổng quan như sau. Chúng ta tạo một đối tượng JsonWriter. Để bắt đầu và kết thúc việc tạo một chuỗi Json, chúng ta sử dụng phương thức beginObject()endObject(). Trong khoảng giữa việc thực thi hai phương thức này, chúng ta thực hiện việc ghi dữ liệu với những cặp (khóa => giá trị).

JsonWriter writer = new JsonWriter();

writer.beginObject();

writer.name("khóa").value("giá trị");

writer.endObject();

  • JsonReader – Đọc trực tiếp từ Json. Cú pháp để thực thi tổng quát như sau. Chúng ta tạo một đối tượng JsonReader. Để bắt đầu và kết thúc việc đọc một chuỗi Json, chúng ta sử dụng phương thức beginObject()endObject(). Trong khoảng giữa việc thực thi hai phương thức này, chúng ta thực hiện việc ghi dữ liệu với những 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();

Gson xử lý trực tiếp nhanh. Tuy nhiên, chúng ta cần xử lý từng cặp (khóa => giá trị) xử lý dữ liệu Json.

Giới thiệu bộ thư viện JAXB

JAXB là viết tắt của Java Architecture for XML Binding, là một thư viện sử dụng các chú thích để chuyển đổi các đối tượng Java thành nội dung XML và ngược lại.

Vì JAXB được định nghĩa thông qua một đặc tả, chúng ta có thể sử dụng các 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ể là:

  • @XmlRootElement: Annotation này chỉ rõ thẻ ngoài cùng của file XML là gì và do đó, nó được khai báo trên đầu một lớp.
  • @XmlElementWrapper: Annotation này tạo ra một phần tử XML bao quanh một danh sách.
  • @XmlElement: Annotation này sử dụng để khai báo một thuộc tính của đối tượng là một thẻ của file XML.
  • @XmlAttribute: Annotation này cũng được sử 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 là như sau. Đầu tiên, chúng ta sẽ khởi tạo đối tượng JAXBContext với đối tượng MyObject để chuyển đổi.

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

Trong đối tượng JAXBContext này, 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, Unmarshaller.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

Trong đối tượng JAXBContext này, nó có một phương thức để tạo đối tượng chuyển đổi đối tượng Java thành nội dung XML là Marshaller.

Marshaller marshallerObj = jaxbContext.createMarshaller ();

Thiết lập chương trình

Bước 1.

Chúng ta thực hiện tạo một project Java mới.

Chúng ta đặt tên project là XmlToJsonExample.

Bước 2.

Chúng ta nhấn chuột phải vào tên project.

Chúng ta lựa chọn New → Folder để tạo thư mục mới.

Bước 3.

Màn hình tạo thư mục mới hiện ra.

Chúng ta đặt tên thư mục là data.

Thư mục này sẽ dùng để lưu trữ những file dữ liệu XML và Json sẵn có.

Chúng ta lựa chọn nút Finish để thực hiện.

Bước 4.

Chúng ta thực hiện download file gson-2.8.5.jar tại địa chỉ:

Here

Bước 5.

Chúng ta tiếp tục tạo các thư mục:

  • Thư mục inputoutput nằm bên trong thư mục data.
  • Thư mục lib để lưu trữ các thư viện.

Chúng ta chép file gson-2.8.5.jar vào trong thư mục lib.

Bước 6.

Chúng ta nhấn chuột phải vào tên project.

Chúng ta lựa chọn Properties.

Bước 7.

Màn hình tùy chỉnh Properties hiện ra.

Chúng ta lựa chọn mục Java Build Path và tab Libraries.

Chúng ta lựa chọn nút Add JARs để thực hiện nạp thêm thư viện.

Bước 8.

Màn hình JAR Selection hiện ra.

Chúng ta lựa chọn file gson-2.8.5.jar trong thư mục lib.

Chúng ta lựa chọn nút OK để thực hiện.

Bước 9.

Quay trở lại cửa sổ Properties.

Chúng ta nhận thấy thư viện gson-2.8.5.jar đã được nạp vào project.

Chúng ta lựa chọn nút Apply and Close để thực hiện.

Bước 10.

Màn hình chính của project hiện ra.

Chúng ta nhận thấy trong mục Referenced Libraries đã hiển thị thông tin về thư viện gson-2.8.5.jar.

Đặc tả XML và Json

Bước 1.

Chúng ta sẽ đặc tả định dạng XML / Json đối với mối quan hệ giữa các đối tượng sau:

  • Quan hệ <1 – n> giữa <department – role>.
  • Quan hệ <1 – n> giữa <role – person>.

Bước 2.

Chúng ta tạo ra 02 file sample.jsonsample.xml trong folder data / input.

Bước 3.

Chúng ta đặc tả dữ liệu trong file sample.xml như sau:

Bước 4.

Chúng ta đặc tả dữ liệu trong file sample.json như sau:

Thực hiện chương trình

Đặc tả đối tượng

Bước 1 – Tạo mới các đối tượng.

Chúng ta tạo ra package model để lưu trữ các đối tượng.

Chúng ta tạo ra các class tương ứng với đặc tả trong XML / Json như sau:

Bước 2 – Đặc tả đối tượng Role – Thuộc tính.

Trước tiên chúng ta đặc tả đối tượng Role với những thuộc tính sau:

Những kỹ thuật lập trình đáng chú ý:

  • Chúng ta định nghĩa annotation @XmlRootElement(name = "role") vào phía trên của tên lớp đối tượng.
  • Điều này giúp cho JAXB biết được rằng đối tượng Role sẽ liên hệ trực tiếp đến thẻ trong định dạng XML.

Bước 3 – Đặc tả đối tượng Role – Phương thức.

Tiếp theo chúng ta đặc tả những phương thức của đối tượng Role:

Những kỹ thuật lập trình đáng chú ý:

  • Chúng ta định nghĩa annotation @XmlAttribute(name = "id") vào phía trên tên của phương thức getId().
  • Điều này giúp cho JAXB biết được rằng thuộc tính id sẽ là một thuộc tính nội tại của thẻ <role> trong định dạng XML.
  • Chúng ta tiếp tục định nghĩa annotation @XmlElement(name = "position") vào phía trên tên của phương thức getPosition() và annotation @XmlElement(name = "salary") vào phía trên tên của phương thức getSalary().
  • Điều này giúp cho JAXB biết được rằng thuộc tính positionsalary sẽ là 02 thuộc tính nội tại của thẻ <role> được định nghĩa thành thẻ riêng <position><salary> trong định dạng XML.

Bước 4 – Đặc tả đối tượng Person – Thuộc tính.

Trước tiên chúng ta đặc tả đối tượng Person với những thuộc tính sau:

Bước 5 – Đặc tả đối tượng Person – Phương thức.

Tiếp theo chúng ta đặc tả những phương thức của đối tượng Person:

Bước 6 – Đặc tả đối tượng Department – Thuộc tính.

Trước tiên chúng ta đặc tả đối tượng Department với những thuộc tính sau:

Bước 7 – Đặc tả đối tượng Department – Phương thức.

Tiếp theo chúng ta đặc tả những phương thức của đối tượng Department:

Những kỹ thuật lập trình đáng chú ý:

  • Chúng ta định nghĩa những annotation @XmlElementWrapper(name = "roles")@XmlElement(name = "role") vào phía trên của phương thức getRoles().
  • Chúng ta định nghĩa những annotation @XmlElementWrapper(name = "persons")@XmlElement(name = "person") vào phía trên của phương thức getPersons().
  • Thứ nhất, điều này giúp cho JAXB biết được rằng thuộc tính rolespersons sẽ là 02 thuộc tính nội tại của thẻ <department> được định nghĩa thành thẻ riêng <roles><persons> trong định dạng XML.
  • Thứ hai, điều này giúp cho JAXB biết được rằng là thẻ <roles> sẽ bao quanh một danh sách những thẻ <role> bên trong.
  • Tương tự nhu vậy, điều này giúp cho JAXB biết được rằng là thẻ <persons> sẽ bao quanh một danh sách những thẻ <person> bên trong.

Bước 8 – Đặc tả đối tượng XMLModel

Đây là đối tượng được đặc tả tương ứng với những thẻ ngoài cùng của sample.xml.

Chúng ta đặc tả đối tượng XMLModel như sau:

Đặc tả xử lý

Bước 1 – Tạo mới các lớp xử lý

Chúng ta tạo ra package service để lưu trữ các lớp xử lý.

Chúng ta tạo ra các class xử lý sau:

Bước 2 – Đặc tả lớp xử lý XMLService – Định nghĩa phương thức

Chúng ta đặc tả lớp xử lý XMLService với những phương thức như sau:

  • Phương thức getObjectFromXmlFile() thực hiện tác vụ trích xuất dữ liệu từ một file XML và chuyển đổi thành một đối tượng Java.
  • Phương thức getObjectFromXMLString() thực hiện tác vụ trích xuất dữ liệu từ một chuỗi định dạng XML và chuyển đổi thành một đối tượng Java.
  • Phương thức parseObjectToXml() thực hiện tác vụ chuyển đổi dữ liệu được lưu trữ trong một đối tượng Java thành định dạng XML và lưu thành file.

Bước 3 – Đặc tả lớp xử lý XMLService – Hiện thực getObjectFromXmlFile().

Chúng ta hiện thực phương thức getObjectFromXmlFile() như sau:

Bước 4 – Đặc tả lớp xử lý XMLService – Hiện thực getObjectFromXMLString().

Chúng ta hiện thực phương thức getObjectFromXMLString() như sau:

Bước 5 – Đặc tả lớp xử lý XMLService – Hiện thực parseObjectToXml().

Chúng ta hiện thực phương thức parseObjectToXml() như sau:

Bước 6 – Đặc tả lớp xử lý JsonService – Định nghĩa phương thức.

Chúng ta đặc tả lớp xử lý JsonService với những phương thức như sau:

  • Phương thức getDataFromJsonFile() thực hiện tác vụ trích xuất dữ liệu từ một file Json.
  • Phương thức writeDataToJsonFile() thực hiện chuyển đổi dữ liệu thành định dạng Json và ghi ra thành file.

Bước 7 – Đặc tả lớp xử lý JsonService – Hiện thực getDataFromJsonFile().

Chúng ta hiện thực phương thức getDataFromJsonFile() như sau:

Tiếp tục với phần nội dung bên trong đoạn mã:

else if (nameRole.equals("persons")) {}

Bước 8 – Đặc tả lớp xử lý JsonService – Hiện thực writeDataToJsonFile().

Chúng ta hiện thực phương thức writeDataToJsonFile() như sau:

Bước 9 – Đặc tả lớp xử lý XmlToJsonService – Định nghĩa phương thức.

Chúng ta đặc tả lớp xử lý XmlToJsonService với những phương thức như sau:

  • Phương thức transformXmlToJson() thực hiện tác vụ trích xuất dữ liệu từ một file XML và chuyển đổi thành định dạng Json và ghi thành file.
  • Phương thức transformJsonToXml() thực hiện tác vụ trích xuất dữ liệu từ một file Json và chuyển đổi thành định dạng XML và ghi thành file.

Bước 10 – Đặc tả lớp xử lý XmlToJsonService – Hiện thực transformXmlToJson().

Chúng ta hiện thực phương thức transformXmlToJson() như sau:

Bước 11 – Đặc tả lớp xử lý XmlToJsonService – Hiện thực transformJsonToXml().

Chúng ta hiện thực phương thức transformJsonToXml() như sau:

Thực thi chương trình.

Chúng ta thực thi chương trình như sau:

Kết luận

Trong nội dung bài này, chúng ta đã cùng nhau tìm hiểu những công nghệ:

  • Đọc và ghi dữ liệu theo định dạng XML với bộ thư viện JAXB.
  • Đọc và ghi dữ liệu theo định dạng Json với bộ thư viện Gson.

Trong những bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những bộ thư viện khác để có nhiều sự chọn lựa hơn khi xử lý 02 định dạng này.

JavaScript Object Notation – JSON

Giới thiệu

Trong nội dung bài này, chúng ta cùng tìm hiểu một định dạng biểu diễn dữ liệu quen thuộc là JSON.

JavaScript Object Notation (JSON) là một kiểu dữ liệu mở.

Kiểu dữ liệu này bao gồm chủ yếu là text, có thể đọc được theo dạng cặp: thuộc tínhgiá trị.

JSON là một kiểu dữ liệu trung gian được dùng để luân chuyển thông tin giữa các thành phần của một chương trình.

Đặc điểm – Cú pháp

Cấu trúc JSON:

  • 1 đối tượng là 1 hổn hợp của các cặp: thuộc tínhgiá trị. 1 đối tượng bắt đầu bởi dấu ngoặc đơn trái { và kết thúc với dấu ngoặc đơn phải }. Từng tên được theo sau bởi dấu 2 chấm : và các cặp thuộc tínhgiá trị được tách ra bởi dấu phẩy ,.
  • 1 mảng là 1 tập hợp các giá trị. 1 mảng bắt đầu bởi dấu ngoặc vuông trái [ và kết thúc với dấu ngoặc vuông phải ]. Các giá trị được cách nhau bởi dấu phẩy ,.
  • Những thuộc tính được chúng ta định nghĩa phù hợp với yêu cầu của chương trình.
  • 1 giá trị có thể là 1 chuỗi string trong những trích dẫn kép hay là 1 số, hay true hay false hay null, hay là 1 đối tượng hay là 1 mảng. Những cấu trúc này có thể đã được lồng vào nhau.

Biểu diễn dữ liệu

Chúng ta thực hiện biểu diễn dữ liệu trong JSON theo đặc tả trong các Hệ quản trị cơ sở dữ liệu.

Bước 1.

Chúng ta có đặc tả cơ sở dữ liệu trong PostgreSQL như sau:

Bước 2.

Chúng ta đặc tả file category.json cho bảng category có bao gồm cả dữ liệu như sau:

Bước 3.

Chúng ta đặc tả file product.json cho bảng product có bao gồm cả dữ liệu như sau:

Bước 4.

Chúng ta cũng có thể đặc tả file complex.json cho cả 02 bảng categoryproduct lồng nhau.

Chú ý rằng với cách này thì cần chú ý về độ lớn của dữ liệu và sự phức tạp trong quá trình truy xuất.

Kết luận

Trong bài này chúng ta đã cùng tìm hiểu sơ bộ về định dạng JSON để đặc tả và lưu trữ dữ liệu.

Trong các bài tiếp theo chúng ta sẽ cùng nhau tìm hiểu cách thức truy xuất định dạng JSON với những kỹ thuật lập trình phù hợp.