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.

Extensible Markup Language – XML

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à XML.

XML (eXtensible Markup Language), nghĩa là “Ngôn ngữ đánh dấu mở rộng”, là ngôn ngữ đánh dấu với mục đích chung do World Wide Web Consortium (W3C) đề nghị.

Đây là một tập con được kế thừa từ Standard Generalized Markup Language (SGML), có khả năng mô tả nhiều loại dữ liệu khác nhau.

Mục đích chính của XML là đơn giản hóa việc chia sẻ dữ liệu giữa các platform và các hệ thống được kết nối với mạng Internet.

Chính vì vậy, XML có tác dụng rất lớn trong việc chia sẻ, trao đổi dữ liệu giữa các hệ thống.

Đặc điểm

Đặc trưng làm XML hữu ích:

  • XML được dùng cho dữ liệu có cấu trúc.
  • XML là có thể mở rộng: chúng ta có thể tạo các thẻ theo qui ước riêng để phù hợp với ứng dụng.
  • XML mang dữ liệu chứ không hiển thị: chúng ta có thể lưu giữ dữ liệu mà không quan tâm đến cái cách nó sẽ được hiển thị.
  • XML là một chuẩn chung: XML được phát triển bởi tổ chức World Wide Web Consortium (W3C) như một chuẩn mở.
  • Về trực quan, XML khá giống với HTML.
  • XML có thể đọc và phân tích nguồn dữ liệu khá dễ dàng nên nó được sử dụng với mục đích chính là trao đổi dữ liệu giữa các chương trình, các hệ thống khác nhau.

Cú pháp

Cú pháp XML cơ bản cho một phần tử là

<tên thuộc_tính=“giá trị”>nội dung</tên>

Ví dụ nội dung của một file XML bao gồm 02 dòng:

<?xml version=“1.0” encoding=“UTF-8”?>

<category_list>Đây là thông tin danh mục</category_list>

Dòng đầu tiên là Khai báo XML (XML declaration): đó là một dòng không bắt buộc, với nhiệm vụ thông báo phiên bản XML đang được sử dụng (thường là phiên bản 1.0), và còn có thể chứa thông tin về mã hóa ký tự và các phụ thuộc bên ngoài.

Phần còn lại của XML chứa các phần tử lồng nhau, một số phần tử trong đó có các thuộc tínhnội dung.

Một phần tử thường bao gồm hai thẻ (tag): một thẻ bắt đầu và một thẻ kết thúc.

Thẻ bắt đầu bao gồm một cái tên đặt trong một cặp ngoặc nhọn như: <category_list>.

Thẻ kết thúc bao gồm chính cái tên đó đặt trong một cặp ngoặc nhọn với một dấu gạch chéo đứng trước như: </category_list>.

Nội dung của phần tử là tất cả những gì nằm giữa thẻ bắt đầuthẻ kết thúc, bao gồm văn bản và các phần tử (con) khác.

Biểu diễn dữ liệu

Chúng ta thực hiện biểu diễn dữ liệu trong XML 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.xml cho bảng category có bao gồm cả dữ liệu như sau:

Bước 3.

Chúng ta đặc tả file product.xml 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.xml 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 XML để đặ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 XML từ với những kỹ thuật lập trình phù hợp.