Konverter JSON til XML Java bruger Gson og JAXB med Eksempel
Hvad er JSON?
JSON er en forkortelse for Javascript Objektnotation, som er en form for data, der følger en bestemt regel om, at de fleste programmeringssprog i øjeblikket er læsbare. Vi kan nemt gemme det til en fil eller post i databasen. JSON-format bruger nøgle-værdi-par til at beskrive data.
Ved at følge eksemplet definerer vi en JSON-streng, der gemmer personlige oplysninger:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
Så syntaksen for JSON er meget enkel. Hver datainformation vil have to dele: nøgle og værdi, som svarer til feltnavnet og dets værdi i en bestemt post. Men når man ser videre, er der et par ting som dette:
- JSON-strengen er omgivet af krøllede seler {}.
- Nøglerne og værdierne for JSON skal være omgivet af anførselstegn {“}.
- Hvis der er flere data (flere nøgle => værdipar), bruger vi kommaer (,) til at adskille.
- JSON-nøgler skal være usignerede bogstaver eller tal, _, og ingen mellemrum, det første tegn bør ikke sættes til tal.
Hvad er XML?
XML står for eXtensible Markup Language også kaldet det extensible markup-sprog foreslået af World Wide Web Consortium (https://www.w3.org/) for at oprette andre markup-sprog. Dette er et simpelt undersæt, der kan beskrive mange forskellige typer data, så det er meget nyttigt til at dele data mellem systemer.
Tags i XML er ofte ikke foruddefinerede, men de er oprettet efter brugerkonventioner. XML introducerer nye funktioner baseret på fordelene ved HTML.
Der er nogle mere nyttige XML-fremstillingsfunktioner i forskellige systemer og løsninger:
- XML kan udvides: XML giver dig mulighed for at oprette dine egne brugerdefinerede tags, der passer til din applikation.
- XML bærer data, ikke viser det: XML giver dig mulighed for at gemme data, uanset hvordan det vil blive vist.
- XML er en fælles standard: XML er udviklet af World Wide Web Consortium (W3C) og er tilgængelig som en åben standard.
XML er bygget på en indlejret nodestruktur. Hver node vil have et åbningsmærke og et afsluttende mærke som følger:
<node>content</node>
Hvori:
- er et åbent tag, er navnet på dette tag defineret af dig.
- er et lukket tag, skal navnet på dette tag matche navnet på det åbne tag.
- indhold er indholdet af dette tag.
Øverst i hver XML-fil skal du angive et tag for at angive, hvilken version XML er i brug. Syntaksen for instruktionstagget:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Hvad er Gson?
Gson (https://github.com/google/gson) er et java-bibliotek, der giver brugerne mulighed for at konvertere fra en Java objekt til JSON-streng og også konvertere fra en JSON-streng til Java objekt. Gson kan arbejde med vilkårlig Java objekter inklusive eksisterende objekter uden at du har deres kildekode.
Siden version 1.6 introducerer Gson to nye klasser – JsonReader og jSONWriter at levere streamingbehandling på JSON-data.
- jSONWriter – Streaming skrive til JSON. Syntaksen for generel implementering er som følger. Vi skaber en jSONWriter objekt. For at starte og afslutte oprettelsen af en JSON-streng bruger vi funktionen startObject() og endObject(). Midt i udførelsen af disse to funktioner udfører vi skrivning af data med par (nøgle => værdi).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader – Streaming læst fra JSON. Syntaksen for generel implementering er som følger. Vi opretter et JsonReader-objekt. For at starte og afslutte oprettelsen af en JSON-streng bruger vi funktionen beginObject() og endObject(). Midt i udførelsen af disse to funktioner udfører vi læsning af data med par (nøgle => værdi).
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("key")) {
String value = reader.nextString();
}
}
reader.endObject();
Gson-streamingbehandling er hurtig. Du skal dog håndtere hvert par (nøgle => værdi) af behandling af JSON-data.
Hvad er JAXB?
JAXB står for Java Architecture for XML Binding, som er et bibliotek, der bruger annoteringer til at konvertere Java objekter til XML-indhold og omvendt. Da JAXB er defineret via en specifikation, kan vi bruge forskellige implementeringer til denne standard.
Med JAXB bruger vi ofte følgende grundlæggende annoteringer, nemlig:
- @XmlRootElement: Denne annotation specificerer, hvad det yderste tag i XML-filen er, og derfor er det erklæret oven på en klasse.
- @XmlElementWrapper: Denne annotation opretter et XML-indpakningselement omkring samlinger.
- @XmlElement: Denne annotation, der bruges til at erklære en attribut for objektet, er et tag for XML-filen.
- @XmlAttribute: Denne annotation, der også bruges til at erklære, at en attribut for objektet er et tag for XML-filen.
Syntaksen for generel implementering er som følger. Først vil vi initialisere JAXBContekst objekt med Mit objekt objekt at konvertere.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
I denne JAXBContekst objekt, har den en metode til at skabe et objekt, der konverterer XML-indhold til en Java objekt, Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
I denne JAXBContekst objekt, har det en metode til at skabe det objekt, der konverterer Java gøre indsigelse mod XML-indholdet, dvs Marshaller.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Sådan konverteres XML til JSON?
Vi implementerer eksemplet med XML – JSON-konvertering på platformen:
- Åbn JDK 8 til Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Udvikling for Ubuntu.
- Gson 2.8.5.
Trin 1) Opret projekt.
Opret en ny Java Projekt.

Trin 2) Indstil projektnavn.
Sæt projektnavn er XmlToJsonEksempel.
Trin 3) Opret en mappe.
oprette mappe data/input indeholdende to filer sample.xml og sample.json.
Lad os først definere vores XML med afdeling, rolle og person, egenskaber.
Den generelle arkitektur 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 andet definerer vi JSON med 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"
}
]
}
]
}
Trin 4) Definer objekt.
Definer tilsvarende objektklasser i pakken 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;
}
}
- 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;
}
}
Trin 5) Opsæt bibliotek.
Tilføj og opsæt bibliotek Gson 2.8.5 til Java Byg sti.
Konverter XML-meddelelse til Java objekter ved hjælp af JAXB
For det første definerer vi præstation klassificeret i pakke service.
Ved det første trin af den første proces bruger vi teknikken Un-marshalling af JAXB.
Un-marshalling giver en klientapplikation mulighed for at konvertere XML-data til JAXB-afledte Java objekter.
Vi definerer funktion getObjectFromXmlFile at fjerne vores XML-fil tilbage til en Java objekt. Denne funktion er defineret 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 kalder ovenstående kode 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();
Så går vi til næste trin.
Konverter Java protesterer mod JSON-meddelelse ved hjælp af Gson
På dette trin definerer vi funktion writeDataToJsonFile at skrive data til JSON-filen. Denne funktion er defineret i klassen JsonService.
Bemærk, at for at skrive en liste over JSON-strenge, bruger vi funktionen beginArray() og endArray(). Mellem disse to funktioner 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 kalder ovenstående kode i klassen XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Det er den første proces.
Konverter JSON-meddelelse til Java objekter ved hjælp af Gson
I det første trin af anden proces definerer vi funktion getDataFromJsonFile for at læse data fra JSON-fil. Denne funktion er defineret i klassen JsonService.
Bemærk, at for at læse en liste over JSON-strenge, bruger vi funktionen beginArray() og endArray(). Mellem disse to funktioner læser 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 kalder ovenstående kode i klassen XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Sådan konverteres Json til XML Java?
JSON til XML in JAVA konverteres ved at bruge JSONObject json = new JSONObject(str); Snor xml = XML. Hvis du har en gyldig dtd-fil eller xml-filen, er det meget nemt at transformere json til xml og også xml til json.
Så går vi til næste trin.
Konverter Java objekter til XML-meddelelse ved hjælp af JAXB
På dette trin bruger vi teknikken Marshalling af JAXB.
Marshalling giver en klientapplikation mulighed for at konvertere en JAXB-afledt Java objekttræ til XML-data.
Vi definerer funktionen parseObjectToXm til marshall Java objekt til XML-meddelelse. Denne funktion er defineret 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 kalder ovenstående kode 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 anden proces.
Konklusion
I denne tutorial lærte vi kort en måde, hvorpå JAXB kan læse XML-data og Gson skrive det til JSON. Tværtimod så vi også den måde, Gson læste på JSON data og JAXB skriver det til XML.

