Teisendage JSON XML-iks Java kasutades Gsoni ja JAXB koos Näidisega
Mis on JSON?
JSON on lühend sõnadest Javascript Object Notation, mis on andmevorm, mis järgib teatud reeglit, et enamik programmeerimiskeeli on praegu loetavad. Saame selle lihtsalt faili salvestada või andmebaasi salvestada. JSON-vorming kasutab andmete kirjeldamiseks võtme-väärtuse paare.
Järgides näidet, määratleme JSON-stringi, mis salvestab isiklikku teavet.
{ "username" : "guru99user", "email" : "guru99user@mail.com" }
Seega on JSON-i süntaks väga lihtne. Igal andmeinfol on kaks osa: võti ja väärtus, mis vastavad välja nimele ja selle väärtusele teatud kirjes. Kuid edasi vaadates on mõned sellised asjad nagu see:
- JSON-string on ümbritsetud lokkis sulgudega {}.
- JSON-i võtmed ja väärtused peavad olema jutumärkides {“}.
- Kui andmeid on rohkem (rohkem võtit => väärtuspaare), kasutame eraldamiseks komasid (,).
- JSON-võtmed peaksid olema allkirjastamata tähed või numbrid, _ ja ilma tühikuteta, esimene märk ei tohiks olla numbritega määratud.
Mis on XML?
XML tähistab eXtensible Markup Language, mida nimetatakse ka laiendatavaks märgistuskeeleks, mille on välja pakkunud World Wide Web Consortium (https://www.w3.org/) muude märgistuskeelte loomiseks. See on lihtne alamhulk, mis suudab kirjeldada mitut erinevat tüüpi andmeid, seega on see väga kasulik andmete jagamisel süsteemide vahel.
XML-i sildid pole sageli eelmääratletud, vaid need luuakse vastavalt kasutaja tavadele. XML tutvustab uusi funktsioone, mis põhinevad HTML-i eelistel.
Erinevates süsteemides ja lahendustes on veel mõned kasulikud XML-i loomise funktsioonid:
- XML on laiendatav: XML võimaldab teil luua oma kohandatud silte, mis sobivad teie rakendusega.
- XML kannab andmeid, mitte ei kuva neid: XML võimaldab salvestada andmeid olenemata sellest, kuidas neid kuvatakse.
- XML on levinud standard: XML-i töötas välja World Wide Web Consortium (W3C) ja see on saadaval avatud standardina.
XML on üles ehitatud pesastatud sõlmestruktuurile. Igal sõlmel on avamise ja sulgemise silt järgmiselt:
<node>content</node>
Milles:
- on avatud silt, määrate selle sildi nime teie ise.
- on suletud silt, peab selle sildi nimi ühtima avatud sildi nimega.
- sisu on selle sildi sisu.
Iga XML-faili ülaosas peate deklareerima sildi, mis näitab kasutatava XML-i versiooni. Juhise sildi süntaks:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Mis on Gson?
Gson (https://github.com/google/gson) on Java teek, mis võimaldab kasutajatel teisendada a Java objekti JSON-stringiks ja teisendada ka JSON-stringiks Java objektiks. Gson saab töötada meelevaldselt Java objekte, sealhulgas olemasolevaid objekte, ilma et teil oleks nende lähtekoodi.
Alates versioonist 1.6 tutvustab Gson kahte uut klassi – JsonReader ja JsonWriter JSON-andmete voogesituse töötlemiseks.
- JsonWriter – JSON-i voogesituse kirjutamine. Üldise rakendamise süntaks on järgmine. Loome a JsonWriter objektiks. JSON-stringi loomise alustamiseks ja lõpetamiseks kasutame funktsiooni beginObject() ja endObject(). Nende kahe funktsiooni täitmise keskel kirjutame andmeid paaridega (klahv => väärtus).
JsonWriter writer = new JsonWriter(); writer.beginObject(); writer.name("key").value("value"); writer.endObject();
- JsonReader - JSON-ist lugemise voogesitus. Üldise rakendamise süntaks on järgmine. Loome JsonReaderi objekti. JSON-stringi loomise alustamiseks ja lõpetamiseks kasutame funktsioone beginObject() ja endObject(). Nende kahe funktsiooni täitmise keskel teostame andmete lugemist paaridega (klahv => väärtus).
JsonReader reader = new JsonReader(); reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("key")) { String value = reader.nextString(); } } reader.endObject();
Gsoni voogesituse töötlemine on kiire. Siiski peate käsitlema iga JSON-andmete töötlemise paari (võti => väärtus).
Mis on JAXB?
JAXB tähistab Java ArchiTecture XML Binding jaoks, mis on teek, mis kasutab teisendamiseks annotatsioone Java objektid XML-sisule ja vastupidi. Kuna JAXB on määratletud spetsifikatsiooni kaudu, saame selle standardi jaoks kasutada erinevaid rakendusi.
JAXB-ga kasutame sageli järgmisi põhimärkusi, nimelt:
- @XmlRootElement: see märkus määrab, mis on XML-faili kõige välimine silt ja seetõttu deklareeritakse see klassi peal.
- @XmlElementWrapper: see märkus loob kogude ümber ümbrise XML-elemendi.
- @XmlElement: see märkus, mida kasutatakse objekti atribuudi deklareerimiseks, on XML-faili silt.
- @XmlAttribute: seda märkust kasutatakse ka objekti atribuudi deklareerimiseks XML-faili sildiks.
Üldise rakendamise süntaks on järgmine. Esiteks initsialiseerime JAXBContekst objektiga MinuObject teisendatav objekt.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
Selle JAXBContekst objektil on meetod objekti loomiseks, mis teisendab XML-sisu a Java objekt, Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Selle JAXBContekst objekt, sellel on meetod objekti loomiseks, mis teisendab Java objekti XML-sisu vastu Marshaller.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Kuidas teisendada XML-i JSON-iks?
Rakendame platvormil XML-JSON konversiooni näidet:
- Avage JDK 8 jaoks Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Arendamine Ubuntu.
- Gson 2.8.5.
Step 1) Loo projekt.
Loo uus Java Projekt.
Step 2) Määrake projekti nimi.
Määra projekti nimi on XmlToJsonExample.
Step 3) Looge kaust.
Loo kaust andmed/sisend sisaldab kahte faili sample.xml ja sample.json.
Esmalt defineerime oma XML-i osakond, roll ja inimene omadused.
Üldine arhitektuur on järgmine: ; .
<?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>
Teiseks määratleme JSON-i, millel on sama idee:
{ "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" } ] } ] }
Step 4) Määratlege objekt.
Määrake paketis vastavad objektiklassid mudel.
- 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; } }
- Person.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; } }
Step 5) Seadistage raamatukogu.
Lisage ja seadistage teeki Gson 2.8.5 Java Ehitage rada.
Teisendage XML-sõnum järgmiseks Java objektid JAXB abil
Esiteks määratleme paketti klassifitseeritud esituse teenus.
Esimese protsessi esimeses etapis kasutame JAXB Un-marshalling tehnikat.
Jaotuse tühistamine annab kliendirakendusele võimaluse teisendada XML-andmed JAXB-st tuletatud andmeteks Java objektid.
Me määratleme funktsiooni getObjectFromXmlFile meie XML-faili taaskäivitamiseks a Java objektiks. See funktsioon on klassis määratletud 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; } }
Kutsume klassis ülaltoodud koodi XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Seejärel läheme järgmise sammu juurde.
Muutma Java objektid Gsoni abil JSON-sõnumile
Selles etapis määratleme funktsiooni writeDataToJsonFile andmete kirjutamiseks JSON-faili. See funktsioon on klassis määratletud JsonService.
Pange tähele, et JSON-stringide loendi kirjutamiseks kasutame funktsiooni beginArray() ja endArray(). Nende kahe funktsiooni vahele kirjutame iga JSON-stringi.
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) { } }
Kutsume klassis ülaltoodud koodi XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
See on esimene protsess.
Teisenda JSON-sõnum järgmiseks Java objektid Gsoni abil
Teise protsessi esimeses etapis määratleme funktsiooni hankigeDataFromJsonFile andmete lugemiseks JSON-failist. See funktsioon on klassis määratletud JsonService.
Pange tähele, et JSON-stringide loendi lugemiseks kasutame funktsiooni beginArray() ja endArray(). Nende kahe funktsiooni vahel loeme iga JSON-stringi.
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) { } }
Kutsume klassis ülaltoodud koodi XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Kuidas teisendada Json XML-i Java?
JSON-ist XML-i in JAVA teisendatakse kasutades JSONObject json = new JSONObject(str); String xml = XML. Kui teil on kehtiv dtd-fail või xml-fail, on jsoni teisendamine xml-ks ja ka xml-i json-iks väga lihtne teisendada.
Seejärel läheme järgmise sammu juurde.
Muutma Java objektid XML-sõnumisse JAXB abil
Selles etapis kasutame JAXB tehnikat.
Marshalling annab kliendirakendusele võimaluse teisendada JAXB tuletatud Java objektipuu XML-andmeteks.
Määrame funktsiooni parseObjectToXm marshallile Java objekt XML-sõnumile. See funktsioon on klassis määratletud
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"); } }
Kutsume klassis ülaltoodud koodi 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);
See on teine protsess.
Järeldus
Selles õpetuses õppisime lühidalt ühte viisi, kuidas JAXB saab lugeda XML-andmeid ja Gson neid JSON-i kirjutada. Vastupidi, me nägime ka seda, kuidas Gson luges JSON andmed ja JAXB kirjutavad need XML-i.