Mengonversi JSON ke XML di Java dengan Gson & JAXB – Panduan Langkah demi Langkah
Apa Itu JSON?
JSON (JavaScript Object Notation) adalah format data ringan dan netral bahasa yang menggunakan pasangan kunci-nilai. Format ini banyak digunakan untuk pertukaran data dan mudah disimpan dalam file atau database.
{ "username": "guru99user", "email": "guru99user@mail.com" } Karakteristik utama:
- Dikurung dalam kurung kurawal {}.
- Kunci dan nilai string dikutip.
- Pasangan dipisahkan oleh koma.
- Kunci menggunakan huruf, angka, underscore; tidak ada angka atau spasi di awal.
Apa Itu XML?
XML (eXtensible Markup Language) adalah standar W3C untuk data terstruktur. Tidak seperti HTML, XML murni adalah format data—tanpa rendering visual. Ini memungkinkan tag khusus, menjadikannya ideal untuk pertukaran data lintas sistem.
Struktur node yang umum:
<node>content</node>
Di bagian atas file XML Anda harus mendeklarasikan versi:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Apa Itu Gson?
Gson adalah pustaka Java yang mentransmisikan objek Java ke JSON dan mendeserialisasi JSON kembali ke objek Java. Sejak v1.6 juga mendukung streaming melalui JsonReader dan JsonWriter.
Contoh penulis streaming:
JsonWriter writer = new JsonWriter(new FileWriter(filePath)); writer.beginObject(); writer.name("key").value("value"); writer.endObject(); writer.close(); Apa Itu JAXB?
JAXB (Java Architecture for XML Binding) memetakan kelas Java ke XML menggunakan anotasi. Ini mendukung marshalling (Java → XML) dan unmarshalling (XML → Java).
Anotasi umum:
@XmlRootElement – mendefinisikan elemen root XML. @XmlElementWrapper – membungkus koleksi. @XmlElement – memetakan bidang ke elemen XML. @XmlAttribute – memetakan bidang ke atribut XML.
Setup Proyek
- Buat proyek Java di IDE Anda (misalnya, Eclipse).
- Berikan nama XmlToJsonExample.
- Tambahkan folder
data/input yang berisi sample.xml dan sample.json. - Sertakan Gson 2.8.5 dalam build path.
- Tambahkan JAXB API (biasanya disertakan dengan Java 8).
Data Sampel
Representasi XML dari departemen dengan peran dan orang:
<?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>
Struktur JSON yang setara:
{ "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"}]} ] } Kelas Model Java
Definisikan POJO berikut dalam paket model:
/* Role.java */ @XmlRootElement(name = "role") public class Role { private String id, position, salary; // getters, setters with @XmlAttribute/@XmlElement annotations } /* Person.java */ @XmlRootElement(name = "person") public class Person { private String id, name, role; // getters, setters with @XmlAttribute/@XmlElement annotations } /* Department.java */ @XmlRootElement(name = "department") public class Department { private List<Role> roles; private List<Person> persons; // getters/setters with @XmlElementWrapper/@XmlElement } /* XMLModel.java */ @XmlRootElement(name = "root") public class XMLModel { private Department department; // getter/setter with @XmlElement } Unmarshalling XML ke Objek Java (JAXB)
public XMLModel getObjectFromXmlFile(String path) throws JAXBException { File file = new File(path); JAXBContext ctx = JAXBContext.newInstance(XMLModel.class); Unmarshaller um = ctx.createUnmarshaller(); return (XMLModel) um.unmarshal(file); } Marshalling Objek Java ke XML (JAXB)
public void parseObjectToXml(String path, XMLModel model) throws JAXBException, IOException { JAXBContext ctx = JAXBContext.newInstance(XMLModel.class); Marshaller m = ctx.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); m.marshal(model, new FileOutputStream(path)); } Serialisasi Objek Java ke JSON (Gson)
public void writeDataToJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException { JsonWriter writer = new JsonWriter(new FileWriter(path)); writer.setIndent(" "); writer.beginObject(); writer.name("roles").beginArray(); for (Role r : roles) { writer.beginObject(); writer.name("id").value(r.getId()); writer.name("position").value(r.getPosition()); writer.name("salary").value(r.getSalary()); writer.name("persons").beginArray(); for (Person p : persons) if (p.getRole().equals(r.getId())) { writer.beginObject(); writer.name("id").value(p.getId()); writer.name("name").value(p.getName()); writer.endObject(); } writer.endArray(); writer.endObject(); } writer.endArray(); writer.endObject(); writer.close(); } Deserialisasi JSON ke Objek Java (Gson)
public void getDataFromJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException { JsonReader reader = new JsonReader(new FileReader(path)); reader.beginObject(); while (reader.hasNext()) { String rootName = reader.nextName(); if ("roles".equals(rootName)) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Role r = new Role(); while (reader.hasNext()) { String key = reader.nextName(); switch (key) { case "id": r.setId(reader.nextString()); break; case "position": r.setPosition(reader.nextString()); break; case "salary": r.setSalary(reader.nextString()); break; case "persons": reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Person p = new Person(); p.setRole(r.getId()); while (reader.hasNext()) { String pKey = reader.nextName(); if ("id".equals(pKey)) p.setId(reader.nextString()); else if ("name".equals(pKey)) p.setName(reader.nextString()); } persons.add(p); reader.endObject(); } reader.endArray(); } } roles.add(r); reader.endObject(); } reader.endArray(); } } reader.endObject(); reader.close(); } Alur Kerja Konversi Lengkap
- Unmarshal
sample.xml ke XMLModel menggunakan JAXB. - Serialisasi objek Java yang dihasilkan ke
sample.json dengan Gson. - Deserialisasi
sample.json kembali ke objek Java. - Marshal objek tersebut ke file XML baru.
Kesimpulan
Panduan ini menunjukkan pipeline konversi dua langkah yang bersih: JAXB menangani XML ↔ Java, sementara Gson menangani JSON ↔ Java. Dengan menggabungkan pustaka ini, pengembang dapat secara andal mentransformasikan data antara format dalam aplikasi Java.