Konverter JSON til XML Java bruker Gson og JAXB med Eksempel
Hva er JSON?
JSON er en forkortelse for Javascript Objektnotasjon, som er en form for data som følger en viss regel om at de fleste programmeringsspråk for tiden er lesbare. Vi kan enkelt lagre den til en fil eller post i databasen. JSON-formatet bruker nøkkelverdi-par for å beskrive data.
Ved å følge eksemplet definerer vi en JSON-streng som lagrer personlig informasjon:
{ "username" : "guru99user", "email" : "guru99user@mail.com" }
Så syntaksen til JSON er veldig enkel. Hver datainformasjon vil ha to deler: nøkkel og verdi som tilsvarer feltnavnet og dets verdi i en bestemt post. Men når vi ser videre, er det et par ting som dette:
- JSON-strengen er omsluttet av krøllete klammeparenteser {}.
- Nøklene og verdiene til JSON må være omgitt av anførselstegn {“}.
- Hvis det er flere data (flere nøkkel => verdipar), bruker vi komma (,) for å skille.
- JSON-nøkler skal være usignerte bokstaver eller tall, _, og ingen mellomrom, det første tegnet skal ikke settes til tall.
Hva er XML?
XML står for eXtensible Markup Language også kalt det utvidbare markup-språket foreslått av World Wide Web Consortium (https://www.w3.org/) for å lage andre markup-språk. Dette er et enkelt delsett som kan beskrive mange forskjellige typer data, så det er veldig nyttig for å dele data mellom systemer.
Tagger i XML er ofte ikke forhåndsdefinert, men de er laget i henhold til brukerkonvensjoner. XML introduserer nye funksjoner basert på fordelene med HTML.
Det er noen mer nyttige funksjoner for å lage XML i forskjellige systemer og løsninger:
- XML kan utvides: XML lar deg lage dine egne tilpassede tagger som passer til din applikasjon.
- XML bærer data, ikke viser det: XML lar deg lagre data uavhengig av hvordan de skal vises.
- XML er en vanlig standard: XML ble utviklet av World Wide Web Consortium (W3C) og er tilgjengelig som en åpen standard.
XML er bygget på en nestet nodestruktur. Hver node vil ha en åpningskode og en avsluttende kode som følger:
<node>content</node>
Der:
- er en åpen tag, er navnet på denne taggen definert av deg.
- er en lukket tag, må navnet på denne taggen samsvare med navnet på den åpne taggen.
- innhold er innholdet i denne taggen.
Øverst i hver XML-fil må du deklarere en kode for å indikere hvilken versjon XML er i bruk. Syntaksen til instruksjonstaggen:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Hva er Gson?
Gson (https://github.com/google/gson) er et java-bibliotek som lar brukere konvertere fra en Java objekt til JSON-streng og også konvertere fra en JSON-streng til Java gjenstand. Gson kan jobbe med vilkårlig Java objekter inkludert eksisterende objekter uten at du har kildekoden deres.
Siden versjon 1.6 introduserer Gson to nye klasser – JsonReader og JsonWriter for å gi strømmebehandling på JSON-data.
- JsonWriter – Streaming skrive til JSON. Syntaksen for generell implementering er som følger. Vi lager en JsonWriter gjenstand. For å starte og fullføre å lage en JSON-streng bruker vi funksjonen beginObject() og endObject(). Midt i utførelsen av disse to funksjonene utfører vi skriving av data med par (nøkkel => verdi).
JsonWriter writer = new JsonWriter(); writer.beginObject(); writer.name("key").value("value"); writer.endObject();
- JsonReader – Streaming lest fra JSON. Syntaksen for generell implementering er som følger. Vi lager et JsonReader-objekt. For å starte og fullføre å lage en JSON-streng bruker vi funksjonen beginObject() og endObject(). Midt i utførelsen av disse to funksjonene utfører vi lesing av data med par (nøkkel => verdi).
JsonReader reader = new JsonReader(); reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("key")) { String value = reader.nextString(); } } reader.endObject();
Gson-strømmebehandling er rask. Du må imidlertid håndtere hvert par (nøkkel => verdi) for behandling av JSON-data.
Hva er JAXB?
JAXB står for Java Architecture for XML Binding, som er et bibliotek som bruker merknader for å konvertere Java objekter mot XML-innhold og omvendt. Ettersom JAXB er definert via en spesifikasjon, kan vi bruke forskjellige implementeringer for denne standarden.
Med JAXB bruker vi ofte følgende grunnleggende merknader, nemlig:
- @XmlRootElement: Denne merknaden spesifiserer hva den ytterste taggen til XML-filen er, og derfor er den erklært på toppen av en klasse.
- @XmlElementWrapper: Denne merknaden lager et XML-omslagselement rundt samlinger.
- @XmlElement: Denne merknaden som brukes til å deklarere et attributt til objektet er en kode for XML-filen.
- @XmlAttribute: Denne merknaden som også brukes til å erklære at et attributt til objektet er en kode for XML-filen.
Syntaksen for generell implementering er som følger. Først vil vi initialisere JAXBContekst objektet med Mitt objekt objekt å konvertere.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
I dette JAXBContekst objekt, har den en metode for å lage et objekt som konverterer XML-innhold til en Java gjenstand, Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
I dette JAXBContekst objekt, har den en metode for å lage objektet som konverterer Java objekt til XML-innholdet som er Marshaller.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Hvordan konvertere XML til JSON?
Vi implementerer eksemplet med XML – JSON-konvertering på plattformen:
- Åpne JDK 8 for Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Utvikling for Ubuntu.
- Gson 2.8.5.
Trinn 1) Lag prosjekt.
Lage en ny Java Prosjekt.
Trinn 2) Angi prosjektnavn.
Angi prosjektnavn er XmlToJsonEksempel.
Trinn 3) Opprett en mappe.
Opprett mappe data/inndata som inneholder to filer sample.xml og sample.json.
La oss først definere vår XML med avdeling, rolle og person egenskaper.
Den generelle arkitekturen er: ; .
<?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>
For det andre definerer vi JSON som har samme idé:
{ "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" } ] } ] }
Trinn 4) Definer objekt.
Definer tilsvarende objektklasser i pakken modell.
- 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; } }
Trinn 5) Sett opp bibliotek.
Legg til og konfigurer bibliotek Gson 2.8.5 til Java Bygg sti.
Konverter XML-melding til Java objekter som bruker JAXB
For det første definerer vi ytelse klassifisert i pakke tjeneste.
I det første trinnet i den første prosessen bruker vi teknikk Un-marshalling av JAXB.
Un-marshalling gir en klientapplikasjon muligheten til å konvertere XML-data til JAXB-avledet Java objekter.
Vi definerer funksjon getObjectFromXmlFile for å fjerne vår XML-fil tilbake til en Java gjenstand. Denne funksjonen er definert i klassen 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; } }
Vi kaller koden ovenfor i timen XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Så går vi til neste trinn.
Konverter Java protesterer mot JSON-melding ved hjelp av Gson
På dette trinnet definerer vi funksjon writeDataToJsonFile for å skrive data til JSON-filen. Denne funksjonen er definert i klassen JsonService.
Merk at for å skrive en liste over JSON-strenger bruker vi funksjonen beginArray() og endArray(). Mellom disse to funksjonene skriver vi hver JSON-streng.
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) { } }
Vi kaller koden ovenfor i klassen XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Det er den første prosessen.
Konverter JSON-melding til Java objekter ved hjelp av Gson
I det første trinnet i den andre prosessen definerer vi funksjon getDataFromJsonFile for å lese data fra JSON-filen. Denne funksjonen er definert i klassen JsonService.
Merk at for å lese en liste over JSON-strenger, bruker vi funksjonen beginArray() og endArray(). Mellom disse to funksjonene leser vi hver JSON-streng.
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) { } }
Vi kaller koden ovenfor i klassen XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Hvordan konvertere Json til XML Java?
JSON til XML in JAVA konverteres ved å bruke JSONObject json = new JSONObject(str); String xml = XML. Hvis du har en gyldig dtd-fil eller xml-filen, er det veldig enkelt å transformere json til xml og også xml til json.
Så går vi til neste trinn.
Konverter Java objekter til XML-melding ved hjelp av JAXB
På dette trinnet bruker vi teknikk Marshalling av JAXB.
Marshalling gir en klientapplikasjon muligheten til å konvertere en JAXB-avledet Java objekttreet til XML-data.
Vi definerer funksjonen parseObjectToXm til marshall Java objekt til XML-melding. Denne funksjonen er definert i klassen
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"); } }
Vi kaller koden ovenfor i klassen 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);
Det er den andre prosessen.
konklusjonen
I denne opplæringen lærte vi kort en måte JAXB kan lese XML-data og Gson skrive dem til JSON. Tvert imot så vi også måten Gson leste på JSON data og JAXB skriver det til XML.