Pretvorite JSON u XML Java koristeći Gson i JAXB s primjerom
Što je JSON?
JSON je skraćenica za Javascript Object Notation, što je oblik podataka koji slijedi određeno pravilo da je većina programskih jezika trenutno čitljiva. Možemo ga jednostavno spremiti u datoteku ili zapis u bazi podataka. Format JSON koristi parove ključ-vrijednost za opisivanje podataka.
Slijedeći primjer, definiramo JSON niz koji pohranjuje osobne podatke:
{ "username" : "guru99user", "email" : "guru99user@mail.com" }
Dakle, sintaksa JSON-a je vrlo jednostavna. Svaka podatkovna informacija će imati dva dijela: ključ i vrijednost koji odgovaraju nazivu polja i njegovoj vrijednosti u određenom zapisu. Ali ako pogledamo dalje, postoji nekoliko stvari poput ovih:
- JSON niz je omeđen vitičastim zagradama {}.
- Ključevi i vrijednosti JSON-a moraju biti u navodnicima {“}.
- Ako postoji više podataka (više parova ključ => vrijednost), za odvajanje koristimo zareze (,).
- JSON ključevi trebaju biti nepotpisana slova ili brojevi, _, bez razmaka, prvi znak ne smije biti postavljen na brojeve.
Što je XML?
XML je kratica za eXtensible Markup Language koji se također naziva i proširivi označni jezik koji je predložio 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, tako da je vrlo koristan u dijeljenju 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 još neke korisne značajke za izradu XML-a u različitim sustavima i rješenjima:
- XML je proširiv: XML vam omogućuje stvaranje vlastitih prilagođenih oznaka koje odgovaraju vašoj aplikaciji.
- XML prenosi podatke, a ne prikazuje ih: XML vam omogućuje pohranu 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 strukturi ugniježđenog čvora. Svaki čvor će imati početnu oznaku i završnu oznaku kako slijedi:
<node>content</node>
U kojem:
- je otvorena oznaka, naziv ove oznake definirate vi.
- je zatvorena oznaka, naziv ove oznake mora odgovarati nazivu otvorene oznake.
- sadržaj je sadržaj ove oznake.
Na vrhu svake XML datoteke morate deklarirati oznaku koja označava verziju XML-a koja se koristi. Sintaksa oznake s uputama:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Što je Gson?
Gson (https://github.com/google/gson) je java biblioteka koja korisnicima omogućuje pretvaranje iz a Java objekt u JSON niz i također pretvoriti iz JSON niza u Java objekt. Gson može raditi s proizvoljnim Java objekte uključujući postojeće objekte bez da imate njihov izvorni kod.
Od verzije 1.6, Gson uvodi dvije nove klase – JsonReader i JsonWriter za pružanje strujanja obrade JSON podataka.
- JsonWriter – Strujanje pisanja u JSON. Sintaksa za opću implementaciju je sljedeća. Mi stvaramo a JsonWriter objekt. Za početak i završetak stvaranja JSON niza koristimo funkciju početniObjekt() i endObject(). Usred izvršavanja ove dvije funkcije vršimo upisivanje podataka s parovima (ključ => vrijednost).
JsonWriter writer = new JsonWriter(); writer.beginObject(); writer.name("key").value("value"); writer.endObject();
- JsonReader – Strujanje čitanja iz JSON-a. Sintaksa za opću implementaciju je sljedeća. Stvaramo objekt JsonReader. Za početak i završetak stvaranja JSON niza koristimo funkciju beginObject() i endObject(). Usred izvršavanja ove dvije funkcije izvodimo čitanje podataka s parovima (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();
Gson strujanje je brzo. Međutim, trebate rukovati svakim parom (ključ => vrijednost) obrade JSON podataka.
Što je JAXB?
JAXB je kratica za Java Architecture za XML Binding, koja je biblioteka koja koristi komentare za pretvorbu Java objekata u XML sadržaj i obrnuto. Budući da je JAXB definiran putem specifikacije, možemo koristiti različite implementacije za ovaj standard.
S JAXB-om često koristimo sljedeće osnovne bilješke, naime:
- @XmlRootElement: Ova napomena specificira što je najudaljenija oznaka XML datoteke i stoga je deklarirana na vrhu klase.
- @XmlElementWrapper: Ova napomena stvara omotni XML element oko zbirki.
- @XmlElement: Ova napomena koja se koristi za deklariranje atributa objekta je oznaka XML datoteke.
- @XmlAttribute: Ova napomena koja se također koristi za deklariranje atributa objekta je oznaka XML datoteke.
Sintaksa za opću implementaciju je sljedeća. Prvo ćemo inicijalizirati JAXBContekst objekt s MyObject objekt pretvoriti.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
U ovom JAXBContekst objekt, ima metodu za stvaranje objekta koji pretvara XML sadržaj u a Java objekt, Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
U ovom JAXBContekst objekt, ima metodu za stvaranje objekta koji pretvara Java objekt na XML sadržaj koji je Marshaller.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Kako pretvoriti XML u JSON?
Implementiramo primjer konverzije XML u JSON na platformi:
- Otvorite JDK 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 je XmlToJsonExample.
Korak 3) Stvorite mapu.
Izradi mapu podatak/unos koji sadrži dvije datoteke uzorak.xml i uzorak.json.
Najprije definirajmo naš XML s odjel, Uloga i osoba svojstva.
Opća arhitektura je: ; .
<?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 s istom idejom:
{ "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 objekt.
Definirajte odgovarajuće klase objekata u paketu model.
- Role.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; } }
- Department.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.
Pretvori XML poruku u Java objekata koji koriste JAXB
Prvo, definiramo izvođenje klasificirano u paketu usluga.
U prvom koraku prvog procesa koristimo tehniku Un-marshalling JAXB-a.
Un-marshalling pruža klijentskoj aplikaciji mogućnost pretvaranja XML podataka u JAXB izvedene Java objekata.
Definiramo funkciju getObjectFromXmlFile da poništimo maršaliranje naše XML datoteke natrag u a Java objekt. Ova je funkcija 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 zovemo u razredu XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Zatim idemo na sljedeći korak.
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 nizova koristimo funkciju početni niz() i endArray(). Između ove dvije funkcije pišemo svaki JSON niz.
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 nazivamo u razredu XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
To je prvi proces.
Pretvori JSON poruku u Java objekata koristeći Gson
U prvom koraku drugog procesa definiramo funkciju getDataFromJsonFile za čitanje podataka iz JSON datoteke. Ova je funkcija definirana u klasi JsonService.
Imajte na umu da za čitanje popisa JSON nizova koristimo funkciju početni niz() i endArray(). Između ove dvije funkcije čitamo svaki JSON niz.
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 nazivamo u razredu XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Kako pretvoriti Json u XML Java?
JSON u XML in Java pretvara se pomoću JSONObject json = new JSONObject(str); Niz xml = XML. Ako imate važeću dtd datoteku ili xml datoteku, vrlo je jednostavno transformirati json u xml i također xml u json.
Zatim idemo na sljedeći korak.
pretvoriti Java objekata u XML poruku koristeći JAXB
U ovom koraku koristimo tehniku Marshalling of JAXB.
Marshalling omogućuje klijentskoj aplikaciji mogućnost pretvaranja izvedenog JAXB-a Java stablo objekata u XML podatke.
Definiramo funkciju parseObjectToXm za marshall Java objekt u XML poruku. 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 nazivamo u razredu 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.
Zaključak
U ovom vodiču ukratko smo naučili jedan način na koji JAXB može čitati XML podatke, a Gson ih pisati u JSON. Naprotiv, vidjeli smo i način na koji je Gson čitao JSON data i JAXB ih zapisuju u XML.