Pretvorite JSON u XML Java korištenjem Gsona i JAXB-a
⚡ Pametni sažetak
Pretvorite JSON u XML Java korištenje Gson-a i JAXB-a putem mapeping oba formata na isti označeni Java klase. Ovaj članak definira svaki format, postavlja projekt, demaršira XML pomoću JAXB-a, zapisuje JSON pomoću Gson-a i obrće cijeli postupak.
Što je JSON?
JSON je skraćenica za JavaNotacija skriptnih objekata, što je format podataka koji slijedi pravila koja većina programskih jezika može pročitati. Možemo ga jednostavno spremiti u datoteku ili pohraniti u bazu podataka. JSON format koristi parove ključ-vrijednost za opis podataka.
U sljedećem primjeru definiramo JSON niz znakova koji pohranjuje osobne podatke:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
Dakle, sintaksa JSON-a je vrlo jednostavna. Svaka stavka podataka ima dva dijela, ključ i vrijednost, koji odgovaraju nazivu polja i njegovoj vrijednosti u zapisu. Ako pogledamo dalje, postoji nekoliko pravila poput ovog:
- JSON niz je omeđen vitičastim zagradama {}.
- Ključevi JSON-a moraju biti zatvoreni dvostrukim navodnicima, a vrijednosti niza znakova također moraju biti pod navodnicima.
- Ako postoji više podataka (više parova ključ => vrijednost), koristimo zareze (,) za njihovo odvajanje.
- JSON ključevi trebaju koristiti obična slova, brojeve ili znak podvlake, bez razmaka, a prvi znak ne smije biti broj.
Što je XML?
XML je kratica za eXtensible Markup Language (eXtensible Markup Language), a predložio ga je World Wide Web Consortium (https://www.w3.org/) za stvaranje drugih jezika za označavanje. Ovo je jednostavan podskup koji može opisati mnoge različite vrste podataka, pa je vrlo koristan za dijeljenje podataka između sustava.
Oznake u XML-u često nisu unaprijed definirane, već se stvaraju prema korisničkim konvencijama. XML uvodi nove značajke temeljene na prednostima HTML-a.
Postoje neke korisne XML značajke za različite sustave i rješenja:
- XML je proširiv: XML vam omogućuje stvaranje vlastitih prilagođenih oznaka koje odgovaraju vašoj aplikaciji.
- XML prenosi podatke, ne prikazuje ih: XML vam omogućuje pohranjivanje podataka bez obzira na to kako će biti prikazani.
- XML je uobičajeni standard: XML je razvio World Wide Web Consortium (W3C) i dostupan je kao otvoreni standard.
XML je izgrađen na ugniježđenoj strukturi čvorova. Svaki čvor ima početnu oznaku i završnu oznaku kako slijedi:
<node>content</node>
U kojem:
- je otvorena oznaka, a naziv ove oznake definirate vi.
- je zatvarajuća oznaka, a naziv ove oznake mora odgovarati nazivu otvarajuće oznake.
- sadržaj je sadržaj ove oznake.
Na vrhu svake XML datoteke morate deklarirati oznaku koja označava XML verziju koja se koristi. Sintaksa oznake instrukcije:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
JSON vs XML: Ključne razlike
Oba formata sadrže strukturirane podatke, a donja tablica pokazuje zašto bi projekt mogao trebati prelaziti između njih.
| Parametar | JSON | XML |
|---|---|---|
| Stil sintakse | Parovi ključa i vrijednosti | Ugniježđene oznake |
| Vrste podataka | Niz, broj, logička vrijednost, null, niz, objekt | Samo tekst, tipovi dolaze iz sheme |
| Značajke | Nije podržano | Podržano na bilo kojem elementu |
| Komentari | Nije podržano | Podržano |
| Govornost | Kompaktni | Opširnije jer se oznake ponavljaju |
| Provjera valjanosti sheme | JSON shema, opcionalno | DTD i XSD, zreli |
| Tipična upotreba | Web API-ji i konfiguracija | Poruke i dokumenti za tvrtke |
Što je Gson?
Gson (https://github.com/google/gson) Je Java biblioteka koja korisnicima omogućuje pretvaranje Java objekt u JSON niz, a također i za pretvaranje JSON niza natrag u Java objekt. Gson može raditi s proizvoljnim Java objekte, uključujući postojeće objekte čiji izvorni kod nemate.
Od verzije 1.6, Gson uvodi dvije klase, JsonReader i jsonWriter, kako bi se omogućila obrada JSON podataka u strujanju.
- jsonWriter – Streaming pisanja u JSON. Stvaramo jsonWriter objekt. Za početak i završetak stvaranja JSON objekta koristimo funkcije početniObjekt() i endObject()Između ta dva poziva, podatke zapisujemo kao parove (ključ => vrijednost).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader – Streaming čitanja iz JSON-a. Izrađujemo JsonReader objekt. Za početak i završetak čitanja JSON objekta koristimo funkcije beginObject() i endObject(). Između ta dva poziva čitamo podatke kao parove (ključ => vrijednost).
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("key")) {
String value = reader.nextString();
}
}
reader.endObject();
Obrada Gson streaminga je brza. Međutim, morate sami obraditi svaki par (ključ => vrijednost) JSON podataka.
Što je JAXB?
JAXB je kratica za Java Architecture za XML Binding, koja je biblioteka koja koristi komentare za pretvorbu Java objekte u XML sadržaj i obrnuto. Budući da je JAXB definiran specifikacijom, možemo koristiti različite implementacije ovog standarda.
S JAXB-om često koristimo sljedeće osnovne anotacije:
- @XmlRootElementOva anotacija određuje najudaljeniju oznaku XML datoteke i stoga je deklarirana iznad klase.
- @XmlElementWrapper: Ova napomena stvara omotni XML element oko zbirki.
- @XmlElementOva anotacija izjavljuje da svojstvo objekta postaje podređena oznaka XML datoteke.
- @XmlAttribute: Ova anotacija deklarira da svojstvo objekta postaje atribut na okolnoj oznaci.
Opća implementacija je sljedeća. Prvo inicijaliziramo JAXBContekst objekt s MyObject razred za pretvorbu.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
Ova JAXBContekst objekt ima metodu koja stvara objekt koji pretvara XML sadržaj u Java objekt, the Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Isti JAXBContekst Objekt također ima metodu koja stvara objekt koji pretvara Java objekt u XML sadržaj, Marshaller.
Marshaller marshallerObj = jaxbContext.createMarshaller();
⚠️ Upozorenje: JAXB je uklonjen iz JDK-a godine Java 11. Na Java 11 i novije, dodajte API i implementaciju za vrijeme izvođenja projektu eksplicitno, na primjer jakarta.xml.bind:jakarta.xml.bind-api Zajedno s org.glassfish.jaxb:jaxb-runtimei uvezite napomene iz jakarta.xml.bind.annotation umjesto javax.xml.bind.annotation.
Kako pretvoriti XML u JSON?
Primjer pretvorbe XML-a u JSON implementirali smo na sljedećoj platformi. Verzije u nastavku su one koje su korištene za snimke zaslona. Novija izdanja JDK-a, Eclipse, i Gson rade na isti način, podložno gornjoj JAXB napomeni.
- OpenJDK 8 za Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Razvoj za Ubuntu.
- Gson 2.8.5.
Korak 1) Izradi projekt.
Napravite novu Java Projekt.
Korak 2) Postavite naziv projekta.
Postavite naziv projekta na XmlToJsonExample.
Korak 3) Stvorite mapu.
Izradi mapu podatak/unos koji sadrži dvije datoteke uzorak.xml i uzorak.json.
Prvo definirajmo naš XML s odjel, Ulogai osoba svojstva.
Opća arhitektura je: jedan odjel ima mnogo uloga, a jedna uloga ima mnogo osoba. Dijagram u nastavku prikazuje te odnose.
<?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>
Drugo, definiramo JSON koji izražava istu ideju. Primijetite da popis osoba postaje ugniježđeni niz unutar svake uloge, što je upravo transformacija koju izvodi kod za konverziju.
{
"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"
}
]
}
]
}
Korak 4) Definirajte objekte.
Definirajte odgovarajuće klase objekata u paketu model.
Uloga.java
@XmlRootElement(name = "role") public class Role { private String id; private String position; private String salary; public Role() { super(); } public Role(String id, String position, String salary) { super(); this.id = id; this.position = position; this.salary = salary; } @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "position") public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } @XmlElement(name = "salary") public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } }
Osoba.java
@XmlRootElement(name = "person") public class Person { private String id; private String name; private String role; public Person() { super(); } public Person(String id, String name, String role) { super(); this.id = id; this.name = name; this.role = role; } @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "role") public String getRole() { return role; } public void setRole(String role) { this.role = role; } }
Odjel.java
@XmlRootElement(name = "department") public class Department { private List<Role> roles; private List<Person> persons; public Department() { super(); } public Department(List<Role> roles, List<Person> persons) { super(); this.roles = roles; this.persons = persons; } @XmlElementWrapper(name = "roles") @XmlElement(name = "role") public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } @XmlElementWrapper(name = "persons") @XmlElement(name = "person") public List<Person> getPersons() { return persons; } public void setPersons(List<Person> persons) { this.persons = persons; } }
XMLModel.java
@XmlRootElement(name = "root") public class XMLModel { private Department department; public XMLModel() { super(); } public XMLModel(Department department) { super(); this.department = department; } @XmlElement(name = "department") public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
Korak 5) Postavite knjižnicu.
Dodajte i postavite biblioteku Gson 2.8.5 u Java Put izgradnje.
Ako projekt koristi Maven Umjesto ručno dodanog JAR-a, iste su biblioteke deklarirane kao ovisnosti. Verzija 2.8.5 ovdje je prikvačena kako bi odgovarala snimkama zaslona, a svako kasnije izdanje Gsona radi identično za ovaj primjer:
<dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!-- required on Java 11 and later --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </dependency> </dependencies>
Pretvori XML poruku u Java objekata koji koriste JAXB
Prvo definiramo izvedbene klase u paketu usluga.
U prvom koraku prvog procesa koristimo tehniku un-marshallinga JAXB-a.
Un-marshalling omogućuje klijentskoj aplikaciji pretvorbu XML podataka u JAXB izvedene podatke. Java objekata.
Definiramo funkciju getObjectFromXmlFile da vratimo našu XML datoteku u Java objekt. Ova funkcija je definirana u klasi XMLService.
public XMLModel getObjectFromXmlFile(String filePath) { try { File file = new File(filePath); JAXBContext jaxbContext = JAXBContext.newInstance(XMLModel.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); XMLModel root = (XMLModel) jaxbUnmarshaller.unmarshal(file); return root; } catch (JAXBException e) { e.printStackTrace(); return null; } }
Gornji kod pozivamo u klasi XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
U ovom trenutku XML datoteka je postala tri Java objekte u memoriji. Sljedeći korak ih zapisuje kao JSON.
pretvoriti Java objekte u JSON poruku koristeći Gson
U ovom koraku definiramo funkciju writeDataToJsonFile za pisanje podataka u JSON datoteku. Ova je funkcija definirana u klasi JsonService.
Imajte na umu da za pisanje popisa JSON objekata koristimo funkcije početni niz() i endArray()Između ova dva poziva pišemo svaki JSON objekt.
public void writeDataToJsonFile(String filePath, List<Role> roles, List<Person> persons) { try { JsonWriter writer = new JsonWriter(new FileWriter(filePath)); writer.setIndent(" "); writer.beginObject(); writer.name("roles"); writer.beginArray(); for (Role role : roles) { writer.beginObject(); writer.name("id").value(role.getId()); writer.name("position").value(role.getPosition()); writer.name("salary").value(role.getSalary()); writer.name("persons"); writer.beginArray(); for (Person person : persons) { if (person.getRole().equalsIgnoreCase(role.getId())) { writer.beginObject(); writer.name("id").value(person.getId()); writer.name("name").value(person.getName()); writer.endObject(); } } writer.endArray(); writer.endObject(); } writer.endArray(); writer.endObject(); writer.close(); } catch (IOException e) { } }
Gornji kod pozivamo u klasi XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
To je prvi proces. Unutarnja petlja uspoređuje svaku osobu s trenutnim ID-om uloge, što je način na koji ravni XML popis osoba postaje ugniježđeni JSON niz.
Pretvori JSON poruku u Java objekata koristeći Gson
U prvom koraku drugog postupka definiramo funkciju getDataFromJsonFile za čitanje podataka iz JSON datoteke. Ova je funkcija definirana u klasi JsonService.
Imajte na umu da za čitanje popisa JSON objekata koristimo funkcije početni niz() i endArray()Između ova dva poziva čitamo svaki JSON objekt.
public void getDataFromJsonFile(String filePath, List<Role> roles, List<Person> persons) { try { JsonReader reader = new JsonReader(new FileReader(filePath)); reader.beginObject(); while (reader.hasNext()) { String nameRoot = reader.nextName(); if (nameRoot.equals("roles")) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Role role = new Role(); while (reader.hasNext()) { String nameRole = reader.nextName(); if (nameRole.equals("id")) { role.setId(reader.nextString()); } else if (nameRole.equals("position")) { role.setPosition(reader.nextString()); } else if (nameRole.equals("salary")) { role.setSalary(reader.nextString()); } else if (nameRole.equals("persons")) { reader.beginArray(); while (reader.hasNext()) { reader.beginObject(); Person person = new Person(); person.setRole(role.getId()); while (reader.hasNext()) { String namePerson = reader.nextName(); if (namePerson.equals("id")) { person.setId(reader.nextString()); } else if (namePerson.equals("name")) { person.setName(reader.nextString()); } } persons.add(person); reader.endObject(); } reader.endArray(); } } roles.add(role); reader.endObject(); } reader.endArray(); } } reader.endObject(); reader.close(); } catch (IOException e) { } }
Gornji kod pozivamo u klasi XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
pretvoriti Java objekata u XML poruku koristeći JAXB
U ovom koraku koristimo tehniku marshallinga JAXB-a.
Marshalling pruža klijentskoj aplikaciji mogućnost pretvaranja JAXB izvedenog Java stablo objekata u XML podatke.
Definiramo funkciju parsirajObjectToXml organizirati Java objekt XML poruke. Ova je funkcija definirana u klasi XMLService.
public void parseObjectToXml(String filePath, XMLModel xmlModel) { try { JAXBContext contextObj = JAXBContext.newInstance(XMLModel.class); Marshaller marshallerObj = contextObj.createMarshaller(); marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshallerObj.marshal(xmlModel, new FileOutputStream(filePath)); } catch (JAXBException je) { System.out.println("JAXBException"); } catch (IOException ie) { System.out.println("IOException"); } }
Gornji kod pozivamo u klasi XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = new XMLModel(); Department department = new Department(); department.setRoles(roles); department.setPersons(persons); xmlModel.setDepartment(department); xmlService.parseObjectToXml(filePathOut, xmlModel);
To je drugi proces. Generirana datoteka odgovara originalnoj datoteci sample.xml, što potvrđuje da je kružno putovanje sačuvalo svaku vrijednost.
Kako pretvoriti JSON u XML u Java bez klase modela?
Gornji pristup je pravi izbor kada je struktura poznata i stabilna, jer anotirane klase dokumentiraju contract. Kada je struktura nepoznata ili se često mijenja, generički pretvarač je brži.
The org.json Biblioteka izvodi pretvorbu u dva retka, bez ikakve klase modela:
import org.json.JSONObject; import org.json.XML; public class QuickConverter { public static void main(String[] args) { String str = "{\"username\":\"guru99user\",\"email\":\"guru99user@mail.com\"}"; JSONObject json = new JSONObject(str); String xml = XML.toString(json); System.out.println(xml); } }
Izlaz:
<username>guru99user</username><email>guru99user@mail.com</email>
Imajte na umu da generička ruta ne proizvodi korijenski element niti atribute, stoga XML.toString(json, "root") obično je potrebno. Tablica u nastavku prikazuje dva pristupa jedan pored drugog.
| Kriterij | Gson s JAXB-om | generička konverzija org.json |
|---|---|---|
| Potrebne klase modela | Da | Ne |
| Kontrola nad strukturom | Puno, uključujući atribute | Ograničeno, samo elementi |
| Rešaping datum | Moguće, kao što je prikazano s ugniježđenim osobama | Nije moguće |
| Linije koda | Mnogi | Dva |
| Najbolje za | Stabilne, dokumentirane sheme | Ad hoc ili nepoznate strukture |
JAXB čita XML podatke, a Gson ih zapisuje u JSON, a obrnuti put koristi Gson za čitanje. JSON podatke dok ih JAXB zapisuje natrag u XML. Za daljnji pregled, pregledajte XML osnove, šire Java udžbeniki Jasper Reports, koji koristi oba formata kao izvore podataka izvješća.









