Mặc dù thông thường các class Java được annotate sử dụng các annotation của thư viện JAXB, sẽ được sử dụng để generate các XML data. Thế nhưng, trong một số trường hợp, các bạn sẽ có nhu cầu generate JSON data thay vì XML sử dụng các Java class này. Để làm được điều này, các bạn có thể sử dụng thư viện Jackson với jackson-module-jaxb-annotations. cho namespace Java EE, hoặc jackson-module-jakarta-xmlbind-annotations cho namespace Jakarta EE. Cụ thể sẽ làm như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Mình sẽ tạo mới một Maven project:
để làm ví dụ.
Mình sẽ sử dụng namespace Jakarta EE nên mình sẽ khai báo JAXB và jackson-module-jakarta-xmlbind-annotations dependency như sau:
1 2 3 4 5 6 7 8 9 10 11 |
<dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jakarta-xmlbind-annotations</artifactId> <version>2.18.1</version> </dependency> |
Để làm ví dụ, mình có class Student được annotate với các annotations của thư viện JAXB 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 40 41 42 43 44 |
package com.huongdanjava.jackson; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "student") public class Student { private String name; private String age; private String code; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public String getAge() { return age; } @XmlElement public void setAge(String age) { this.age = age; } public String getCode() { return code; } @XmlElement public void setCode(String code) { this.code = code; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", code=" + code + "]"; } } |
Mình sẽ khởi tạo một đối tượng Student với các thông tin như sau:
1 2 3 4 |
Student student = new Student(); student.setAge("37"); student.setName("Khanh"); student.setCode("123"); |
Để generate thông tin của đối tượng Student ở định dạng JSON, đầu tiên, mình cũng sẽ khởi tạo đối tượng ObjectMapper như sau:
1 2 |
ObjectMapper om = new ObjectMapper(); om.configure(SerializationFeature.WRAP_ROOT_VALUE, true); |
Tiếp theo, chúng ta cần enable support Jakarta XML Binding cho đối tượng ObjectMapper sử dụng class JakartaXmlBindAnnotationIntrospector, bằng một trong 2 cách sau:
1 2 |
JakartaXmlBindAnnotationModule module = new JakartaXmlBindAnnotationModule(); om.registerModule(module); |
hoặc:
1 2 |
AnnotationIntrospector intr = new JakartaXmlBindAnnotationIntrospector(om.getTypeFactory()); om.setAnnotationIntrospector(intr); |
1 |
và bây giờ, chúng ta sẽ sử dụng phương thức writeValueAsString() của đối tượng ObjectMapper để chuyển đổi đối tượng Student sang chuỗi JSON:
1 2 |
String json = om.writeValueAsString(student); System.out.println(json); |
Toàn bộ code của mình 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 |
package com.huongdanjava.jackson; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.AnnotationIntrospector; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; public class Application { public static void main(String[] args) throws JsonProcessingException { Student student = new Student(); student.setAge("37"); student.setName("Khanh"); student.setCode("123"); ObjectMapper om = new ObjectMapper(); om.configure(SerializationFeature.WRAP_ROOT_VALUE, true); AnnotationIntrospector intr = new JakartaXmlBindAnnotationIntrospector(om.getTypeFactory()); om.setAnnotationIntrospector(intr); String json = om.writeValueAsString(student); System.out.println(json); } } |
Kết quả khi mình chạy ví dụ của mình như sau: