Konverter JSON til XML Java bruker Gson og JAXB
โก Smart oppsummering
Konverter JSON til XML Java bruker Gson og JAXB via kartping begge formatene pรฅ den samme kommenterte Java klasser. Denne artikkelen definerer hvert format, setter opp prosjektet, avkoder XML med JAXB, skriver JSON med Gson og reverserer hele prosessen.

Hva er JSON?
JSON er en forkortelse for JavaSkriptobjektnotasjon, som er et dataformat som fรธlger regler som de fleste programmeringssprรฅk kan lese. Vi kan enkelt lagre det i en fil eller lagre det i en database. JSON-formatet bruker nรธkkelverdipar for รฅ beskrive data.
I fรธlgende eksempel definerer vi en JSON-streng som lagrer personlig informasjon:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
Sรฅ syntaksen til JSON er veldig enkel. Hvert dataelement har to deler, en nรธkkel og en verdi, som korresponderer med feltnavnet og verdien i en post. Ved nรฆrmere ettersyn finnes det noen regler som denne:
- JSON-strengen er omsluttet av krรธllete klammeparenteser {}.
- Nรธklene til JSON mรฅ vรฆre omsluttet av doble anfรธrselstegn, og strengverdier mรฅ ogsรฅ vรฆre i anfรธrselstegn.
- Hvis det er mer data (flere nรธkkel => verdipar), bruker vi komma (,) for รฅ skille dem.
- JSON-nรธkler skal bruke vanlige bokstaver, tall eller understrekingstegnet, uten mellomrom, og det fรธrste tegnet skal ikke vรฆre et tall.
Hva er XML?
XML stรฅr for eXtensible Markup Language, foreslรฅtt av World Wide Web Consortium (https://www.w3.org/) for รฅ lage andre markupsprรฅ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 finnes noen nyttige XML-funksjoner for ulike systemer og lรธsninger:
- XML kan utvides: XML lar deg lage dine egne tilpassede tagger som passer til din applikasjon.
- XML bรฆrer data, det viser dem ikke: 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 har en รฅpningstag og en avsluttende tag som fรธlger:
<node>content</node>
Der:
- er en รฅpen tagg, og navnet pรฅ denne taggen defineres av deg.
- er en avsluttende tag, og navnet pรฅ denne taggen mรฅ samsvare med navnet pรฅ den รฅpne taggen.
- innhold er innholdet i denne taggen.
รverst i hver XML-fil mรฅ du deklarere en tagg for รฅ angi hvilken XML-versjon som er i bruk. Syntaksen til instruksjonstaggen:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
JSON vs XML: Viktige forskjeller
Begge formatene inneholder strukturerte data, og tabellen nedenfor viser hvorfor et prosjekt kan trenge รฅ veksle mellom dem.
| Parameter | JSON | XML |
|---|---|---|
| Syntaksstil | Nรธkkel- og verdipar | Nestede tagger |
| Datatyper | Streng, tall, boolsk, null, array, objekt | Kun tekst, typer kommer fra et skjema |
| attributter | Stรธttes ikke | Stรธttet pรฅ alle elementer |
| Kommentar | Stรธttes ikke | Stรธttes |
| Retterhet | Kompakt | Mer ordrikt fordi taggene gjentas |
| Skjemavalidering | JSON-skjema, valgfritt | DTD og XSD, moden |
| Typisk bruk | Web-API-er og konfigurasjon | Bedriftsmeldinger og dokumenter |
Hva er Gson?
Gson (https://github.com/google/gson) Er en Java bibliotek som lar brukere konvertere en Java objekt til en JSON-streng, og ogsรฅ for รฅ konvertere en JSON-streng tilbake til en Java gjenstand. Gson kan jobbe med vilkรฅrlig Java objekter, inkludert eksisterende objekter med kildekode du ikke har.
Siden versjon 1.6 introduserer Gson to klasser, JsonReader og jsonWriter, for รฅ tilby strรธmming av behandling av JSON-data.
- jsonWriter โ Strรธmming av skriving til JSON. Vi lager en jsonWriter objekt. For รฅ starte og fullfรธre oppretting av et JSON-objekt bruker vi funksjonene beginObject() og endObject()Mellom disse to kallene skriver vi data som par (nรธkkel => verdi).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader โ Strรธmming av lesing fra JSON. Vi oppretter et JsonReader-objekt. For รฅ starte og fullfรธre lesing av et JSON-objekt bruker vi funksjonene beginObject() og endObject(). Mellom disse to kallene leser vi data som 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รธmmeprosessering er rask. Du mรฅ imidlertid hรฅndtere hvert par (nรธkkel => verdi) av JSON-dataene selv.
Hva er JAXB?
JAXB stรฅr for Java Architecture for XML Binding, som er et bibliotek som bruker merknader for รฅ konvertere Java objekter til XML-innhold og omvendt. Siden JAXB er definert av en spesifikasjon, kan vi bruke forskjellige implementeringer av denne standarden.
Med JAXB bruker vi ofte fรธlgende grunnleggende annoteringer:
- @XmlRootElementDenne annotasjonen spesifiserer den ytterste taggen i XML-filen, og den er derfor deklarert over en klasse.
- @XmlElementWrapper: Denne merknaden lager et XML-omslagselement rundt samlinger.
- @XmlElementDenne annotasjonen erklรฆrer at en egenskap til objektet blir en underordnet tagg til XML-filen.
- @XmlAttributeDenne annotasjonen erklรฆrer at en egenskap ved objektet blir et attributt pรฅ den omkringliggende taggen.
Den generelle implementeringen er som fรธlger. Fรธrst initialiserer vi JAXBContekst objektet med Mitt objekt klasse รฅ konvertere.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
Dette JAXBContekst objektet har en metode som oppretter et objekt som konverterer XML-innhold til en Java objektet, det Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Det samme JAXBContekst objektet har ogsรฅ en metode som oppretter objektet som konverterer en Java objektet inn i XML-innhold, Marshaller.
Marshaller marshallerObj = jaxbContext.createMarshaller();
โ ๏ธ Advarsel: JAXB ble fjernet fra JDK i Java 11. Pรฅ Java 11 og senere, legg til API-et og en runtime-implementering eksplisitt i prosjektet, for eksempel jakarta.xml.bind:jakarta.xml.bind-api Sammen med org.glassfish.jaxb:jaxb-runtime, og importer merknadene fra jakarta.xml.bind.annotation istedenfor javax.xml.bind.annotation.
Hvordan konvertere XML til JSON?
Vi implementerer eksemplet pรฅ konvertering fra XML til JSON pรฅ fรธlgende plattform. Versjonene nedenfor er de som brukes til skjermbildene. Nyere versjoner av JDK, Eclipse, og Gson fungerer pรฅ samme mรฅte, med forbehold om JAXB-notatet ovenfor.
- OpenJDK 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.
Sett prosjektnavnet til XmlToJsonEksempel.
Trinn 3) Opprett en mappe.
Opprett mappen data/inndata som inneholder de to filene sample.xml og sample.json.
La oss fรธrst definere XML-en vรฅr med avdeling, rolleog person egenskaper.
Den generelle arkitekturen er: รฉn avdeling har mange roller, og รฉn rolle har mange personer. Diagrammet nedenfor viser disse relasjonene.
<?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-en som uttrykker den samme ideen. Legg merke til at den flate personlisten blir en nestet matrise inni hver rolle, som er nรธyaktig den transformasjonen konverteringskoden utfรธrer.
{
"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 objekter.
Definer de tilsvarende objektklassene 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; } }
Avdeling.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 biblioteket.
Legg til og konfigurer Gson 2.8.5-biblioteket i Java Bygg sti.
Hvis prosjektet bruker Maven I stedet for en manuelt lagt til jar-fil, deklareres de samme bibliotekene som avhengigheter. Versjon 2.8.5 er festet her for รฅ matche skjermbildene, og eventuelle senere Gson-utgivelser fungerer identisk for dette eksemplet:
<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>
Konverter XML-melding til Java objekter som bruker JAXB
Fรธrst definerer vi utรธvende klasser i pakken tjeneste.
I det fรธrste trinnet i den fรธrste prosessen bruker vi av-marshalling-teknikken JAXB.
Avmarshalling gir en klientapplikasjon muligheten til รฅ konvertere XML-data til JAXB-avledede data. Java objekter.
Vi definerer funksjonen getObjectFromXmlFile รฅ fjerne XML-filen vรฅr fra marsjalen tilbake til en Java objekt. 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 klassen XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Pรฅ dette tidspunktet har XML-filen blitt tre Java objekter i minnet. Neste trinn skriver dem ut som JSON.
Konverter Java protesterer mot JSON-melding ved hjelp av Gson
I dette trinnet definerer vi funksjonen writeDataToJsonFile รฅ skrive data til JSON-filen. Denne funksjonen er definert i klassen JsonService.
Merk at for รฅ skrive en liste over JSON-objekter bruker vi funksjonene beginArray() og endArray()Mellom disse to kallene skriver vi hvert 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) { } }
Vi kaller koden ovenfor i klassen XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Det er den fรธrste prosessen. Den indre lรธkken matcher hver person mot gjeldende rolle-ID, og โโdet er slik den flate XML-personlisten blir en nestet JSON-matrise.
Konverter JSON-melding til Java objekter ved hjelp av Gson
I det fรธrste trinnet i den andre prosessen definerer vi funksjonen getDataFromJsonFile for รฅ lese data fra JSON-filen. Denne funksjonen er definert i klassen JsonService.
Merk at for รฅ lese en liste over JSON-objekter bruker vi funksjonene beginArray() og endArray()Mellom disse to kallene leser vi hvert 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) { } }
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);
Konverter Java objekter til XML-melding ved hjelp av JAXB
I dette trinnet bruker vi marshallingteknikken til JAXB.
Marshalling gir en klientapplikasjon muligheten til รฅ konvertere en JAXB-avledet Java objekttreet til XML-data.
Vi definerer funksjonen parseObjectToXml รฅ marsjere Java objekt til en 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. Den genererte filen samsvarer med den opprinnelige sample.xml, som bekrefter at rundreisen bevarte alle verdiene.
Slik konverterer du JSON til XML i Java uten en modellklasse?
Tilnรฆrmingen ovenfor er det riktige valget nรฅr strukturen er kjent og stabil, fordi de kommenterte klassene dokumenterer konsekvensene.tract. Nรฅr strukturen er ukjent eller endres ofte, er en generisk konverter raskere.
Ocuco org.json biblioteket utfรธrer konverteringen pรฅ to linjer, uten noen modellklasse:
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); } }
Utgang:
<username>guru99user</username><email>guru99user@mail.com</email>
Merk at den generiske ruten ikke produserer noe rotelement og ingen attributter, sรฅ XML.toString(json, "root") er vanligvis nรธdvendig. Tabellen nedenfor viser de to tilnรฆrmingene side om side.
| Criterion | Gson med JAXB | org.json generisk konvertering |
|---|---|---|
| Modellklasser kreves | Ja | Nei |
| Kontroll over struktur | Fullstendig, inkludert attributter | Begrenset, kun elementer |
| Reshaping dato | Mulig, som vist med nestede personer | Ikke mulig |
| Linjer med kode | Mange | To |
| Best for | Stabile, dokumenterte skjemaer | Ad hoc- eller ukjente strukturer |
JAXB leser XML-data og Gson skriver dem til JSON, og den omvendte banen bruker Gson til รฅ lese JSON data mens JAXB skriver dem tilbake til XML. For รฅ gรฅ videre, se gjennom XML grunnleggende, det bredere Java tutorialog Jasper rapporterer, som bruker begge formatene som rapportdatakilder.








