Mình đã giới thiệu với các bạn về JSON Binding specification của Jakarta EE để convert qua lại giữa JSON data và Java object. Để parse, generate, transform hoặc query JSON data, các bạn có thể sử dụng một specification khác của Jakarta EE là JSON Processing. Cụ thể như thế nào? Chúng ta sẽ cùng nhau tìm hiểu về JSON Processing và implementation của nó là Eclipse Parsson trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
Eclipse Parsson dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>org.eclipse.parsson</groupId> <artifactId>parsson</artifactId> <version>1.1.1</version> </dependency> |
Tương tự như JSON Binding, các bạn có thể generate JSON data từ một đối tượng Java sử dụng JSON Processing.
Ví dụ mình có một class Student định nghĩa thông tin sinh viên như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.huongdanjava.jakartaee; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } |
Các bạn có thể generate ra JSON data thông tin sinh viên sử dụng phương thức write() của class JsonWriter được khởi tạo từ class Json với phương thức createWriter(). Nhưng để làm được điều này, các bạn cần định nghĩa Json data với class JsonObject sử dụng class JsonObjectBuilder trước:
1 2 3 4 5 6 7 |
Student student = new Student("Khanh", 35); JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder() .add("name", student.getName()) .add("age", student.getAge()); JsonObject jsonObject = jsonObjectBuilder.build(); |
Giờ thì chúng ta sẽ sử dụng một implementation của class Writer như StringWriter để write thông tin sinh viên này ra JSON data như sau:
1 2 3 4 5 6 7 |
String json; try (Writer writer = new StringWriter()) { Json.createWriter(writer).write(jsonObject); json = writer.toString(); } System.out.println(json); |
Kết quả:
Để format chuỗi JSON được generate, các bạn có thể sử dụng class JsonWriterFactory.
Class JsonWriterFactory này cho phép chúng ta cấu hình cách mà chúng ta generate chuỗi Json sẽ như thế nào. Chúng ta sẽ cần một đối tượng Map chứa thông tin cấu hình với key và value sau đó thì tạo mới đối tượng JsonWriterFactory với các thông tin cấu hình này.
Ví dụ để format chuỗi Json được generate, mình sẽ khởi tạo đối tượng Map chứa thông tin cấu hình trước:
1 2 |
Map<String, Boolean> config = new HashMap<>(); config.put(JsonGenerator.PRETTY_PRINTING, true); |
Sau đó thì khởi tạo đối tượng JsonWriterFactory:
1 |
JsonWriterFactory writerFactory = Json.createWriterFactory(config); |
Giờ thì chúng ta sẽ sử dụng phương thức createWriter() của đối tượng JsonWriterFactory thay vì đối tượng của class Json để tạo mới Writer và write thông tin sinh viên ra:
1 2 3 4 5 6 7 |
String json; try (Writer writer = new StringWriter()) { writerFactory.createWriter(writer).write(jsonObject); json = writer.toString(); } System.out.println(json); |
Kết quả khi chạy lại ví dụ:
JSON Processing cũng cho phép chúng ta convert một chuỗi Json data qua đối tượng Java, nhưng cách làm thì khác với JSON Binding.
Chúng ta sẽ sử dụng đối tượng Json Reader để đọc nội dung của Json data và đưa vào đối tượng JsonObject.
1 2 3 4 5 6 7 8 9 |
String json = """ { "name": "Khanh", "age": 35 } """; JsonReader reader = Json.createReader(new StringReader(json)); JsonObject jsonObject = reader.readObject(); |
Sau đó thì khởi tạo đối tượng Student, lấy thông tin các thuộc tính của đối tượng Student này từ đối tượng JsonObject trên như sau:
1 2 3 4 5 |
Student student = new Student(); student.setName(jsonObject.getString("name")); student.setAge(jsonObject.getInt("age")); System.out.println(student); |
Kết quả:
Mình sẽ hướng dẫn các bạn cách query, transform Json data sử dụng JSON Processing trong các bài viết sau các bạn nhé!