Pretvorite JSON u XML Java korištenjem Gsona i JAXB-a

⚡ Pametni sažetak

Pretvorite JSON u XML Java korištenje Gson-a i JAXB-a putem mapeping oba formata na isti označeni Java klase. Ovaj članak definira svaki format, postavlja projekt, demaršira XML pomoću JAXB-a, zapisuje JSON pomoću Gson-a i obrće cijeli postupak.

  • 🗝️ JSON struktura: Podaci se pohranjuju kao parovi ključ i vrijednost unutar vitičastih zagrada, pri čemu su zarezi odvojeni svakim unosom.
  • 🏷️ XML struktura: Podaci se pohranjuju u ugniježđene čvorove, gdje svaka početna oznaka zahtijeva odgovarajuću završnu oznaku.
  • 🔗 Dijeljeni model: Jedan skup anotiranih Java Klase djeluju kao most, tako da se nijedan format ne parsira izravno u drugi.
  • 📥 Raspoređivanje: JAXB čita XML datoteku i vraća popunjenu Java stablo objekata kroz klasu Unmarshaller.
  • 📤 Strujanje pisanja: Gson JsonWriter emitira JSON inkrementalno s pozivima beginObject, name, value i endObject.
  • 🔄 Reverse Staza: JsonReader ponovno gradi objekte iz JSON-a, a JAXB Marshaller ih ponovno zapisuje kao XML.
  • ⚠️ Napomena o vremenu izvođenja: JAXB je napustio JDK u Java 11, stoga se ovisnost jakarta.xml.bind mora eksplicitno dodati.

Pretvori JSON u XML u Java

Što je JSON?

JSON je skraćenica za JavaNotacija skriptnih objekata, što je format podataka koji slijedi pravila koja većina programskih jezika može pročitati. Možemo ga jednostavno spremiti u datoteku ili pohraniti u bazu podataka. JSON format koristi parove ključ-vrijednost za opis podataka.

U sljedećem primjeru definiramo JSON niz znakova koji pohranjuje osobne podatke:

{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}

Dakle, sintaksa JSON-a je vrlo jednostavna. Svaka stavka podataka ima dva dijela, ključ i vrijednost, koji odgovaraju nazivu polja i njegovoj vrijednosti u zapisu. Ako pogledamo dalje, postoji nekoliko pravila poput ovog:

  • JSON niz je omeđen vitičastim zagradama {}.
  • Ključevi JSON-a moraju biti zatvoreni dvostrukim navodnicima, a vrijednosti niza znakova također moraju biti pod navodnicima.
  • Ako postoji više podataka (više parova ključ => vrijednost), koristimo zareze (,) za njihovo odvajanje.
  • JSON ključevi trebaju koristiti obična slova, brojeve ili znak podvlake, bez razmaka, a prvi znak ne smije biti broj.

Što je XML?

XML je kratica za eXtensible Markup Language (eXtensible Markup Language), a predložio ga je 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, pa je vrlo koristan za dijeljenje 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 neke korisne XML značajke za različite sustave i rješenja:

  • XML je proširiv: XML vam omogućuje stvaranje vlastitih prilagođenih oznaka koje odgovaraju vašoj aplikaciji.
  • XML prenosi podatke, ne prikazuje ih: XML vam omogućuje pohranjivanje 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 ugniježđenoj strukturi čvorova. Svaki čvor ima početnu oznaku i završnu oznaku kako slijedi:

<node>content</node>

U kojem:

  • je otvorena oznaka, a naziv ove oznake definirate vi.
  • je zatvarajuća oznaka, a naziv ove oznake mora odgovarati nazivu otvarajuće oznake.
  • sadržaj je sadržaj ove oznake.

Na vrhu svake XML datoteke morate deklarirati oznaku koja označava XML verziju koja se koristi. Sintaksa oznake instrukcije:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

JSON vs XML: Ključne razlike

Oba formata sadrže strukturirane podatke, a donja tablica pokazuje zašto bi projekt mogao trebati prelaziti između njih.

Parametar JSON XML
Stil sintakse Parovi ključa i vrijednosti Ugniježđene oznake
Vrste podataka Niz, broj, logička vrijednost, null, niz, objekt Samo tekst, tipovi dolaze iz sheme
Značajke Nije podržano Podržano na bilo kojem elementu
Komentari Nije podržano Podržano
Govornost Kompaktni Opširnije jer se oznake ponavljaju
Provjera valjanosti sheme JSON shema, opcionalno DTD i XSD, zreli
Tipična upotreba Web API-ji i konfiguracija Poruke i dokumenti za tvrtke

Što je Gson?

Gson (https://github.com/google/gson) Je Java biblioteka koja korisnicima omogućuje pretvaranje Java objekt u JSON niz, a također i za pretvaranje JSON niza natrag u Java objekt. Gson može raditi s proizvoljnim Java objekte, uključujući postojeće objekte čiji izvorni kod nemate.

Od verzije 1.6, Gson uvodi dvije klase, JsonReader i jsonWriter, kako bi se omogućila obrada JSON podataka u strujanju.

  • jsonWriter – Streaming pisanja u JSON. Stvaramo jsonWriter objekt. Za početak i završetak stvaranja JSON objekta koristimo funkcije početniObjekt() i endObject()Između ta dva poziva, podatke zapisujemo kao parove (ključ => vrijednost).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
  • JsonReader – Streaming čitanja iz JSON-a. Izrađujemo JsonReader objekt. Za početak i završetak čitanja JSON objekta koristimo funkcije beginObject() i endObject(). Između ta dva poziva čitamo podatke kao parove (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();

Obrada Gson streaminga je brza. Međutim, morate sami obraditi svaki par (ključ => vrijednost) JSON podataka.

Što je JAXB?

JAXB je kratica za Java Architecture za XML Binding, koja je biblioteka koja koristi komentare za pretvorbu Java objekte u XML sadržaj i obrnuto. Budući da je JAXB definiran specifikacijom, možemo koristiti različite implementacije ovog standarda.

S JAXB-om često koristimo sljedeće osnovne anotacije:

  • @XmlRootElementOva anotacija određuje najudaljeniju oznaku XML datoteke i stoga je deklarirana iznad klase.
  • @XmlElementWrapper: Ova napomena stvara omotni XML element oko zbirki.
  • @XmlElementOva anotacija izjavljuje da svojstvo objekta postaje podređena oznaka XML datoteke.
  • @XmlAttribute: Ova anotacija deklarira da svojstvo objekta postaje atribut na okolnoj oznaci.

Opća implementacija je sljedeća. Prvo inicijaliziramo JAXBContekst objekt s MyObject razred za pretvorbu.

JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);

Ova JAXBContekst objekt ima metodu koja stvara objekt koji pretvara XML sadržaj u Java objekt, the Unmarshaller.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

Isti JAXBContekst Objekt također ima metodu koja stvara objekt koji pretvara Java objekt u XML sadržaj, Marshaller.

Marshaller marshallerObj = jaxbContext.createMarshaller();

⚠️ Upozorenje: JAXB je uklonjen iz JDK-a godine Java 11. Na Java 11 i novije, dodajte API i implementaciju za vrijeme izvođenja projektu eksplicitno, na primjer jakarta.xml.bind:jakarta.xml.bind-api Zajedno s org.glassfish.jaxb:jaxb-runtimei uvezite napomene iz jakarta.xml.bind.annotation umjesto javax.xml.bind.annotation.

Kako pretvoriti XML u JSON?

Primjer pretvorbe XML-a u JSON implementirali smo na sljedećoj platformi. Verzije u nastavku su one koje su korištene za snimke zaslona. Novija izdanja JDK-a, Eclipse, i Gson rade na isti način, podložno gornjoj JAXB napomeni.

  • OpenJDK 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.

Napravite novu Java Projekt.

Korak 2) Postavite naziv projekta.
Postavite naziv projekta na XmlToJsonExample.

Postavite naziv projekta

Korak 3) Stvorite mapu.
Izradi mapu podatak/unos koji sadrži dvije datoteke uzorak.xml i uzorak.json.

Stvorite podatke mape

Prvo definirajmo naš XML s odjel, Ulogai osoba svojstva.

Opća arhitektura je: jedan odjel ima mnogo uloga, a jedna uloga ima mnogo osoba. Dijagram u nastavku prikazuje te odnose.

Objektni odnosi

<?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 koji izražava istu ideju. Primijetite da popis osoba postaje ugniježđeni niz unutar svake uloge, što je upravo transformacija koju izvodi kod za konverziju.

{
	"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 objekte.
Definirajte odgovarajuće klase objekata u paketu model.

Definirajte klase objekata

Uloga.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;
	}
}

Odjel.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.

Postavite knjižnicu Gson

Dodajte biblioteku Gson 2.8.5 u Java Put izgradnje

Ako projekt koristi Maven Umjesto ručno dodanog JAR-a, iste su biblioteke deklarirane kao ovisnosti. Verzija 2.8.5 ovdje je prikvačena kako bi odgovarala snimkama zaslona, ​​a svako kasnije izdanje Gsona radi identično za ovaj primjer:

<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>

Pretvori XML poruku u Java objekata koji koriste JAXB

Prvo definiramo izvedbene klase u paketu usluga.

Definirajte izvedbene razrede

U prvom koraku prvog procesa koristimo tehniku ​​​​un-marshallinga JAXB-a.

Un-marshalling omogućuje klijentskoj aplikaciji pretvorbu XML podataka u JAXB izvedene podatke. Java objekata.

Definiramo funkciju getObjectFromXmlFile da vratimo našu XML datoteku u Java objekt. Ova funkcija je 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 pozivamo u klasi XmlToJsonService.

XMLService xmlService = new XMLService();
XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn);

Department department = xmlModel.getDepartment();
List<Role> roles = department.getRoles();
List<Person> persons = department.getPersons();

U ovom trenutku XML datoteka je postala tri Java objekte u memoriji. Sljedeći korak ih zapisuje kao JSON.

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 objekata koristimo funkcije početni niz() i endArray()Između ova dva poziva pišemo svaki 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) {
	}
}

Gornji kod pozivamo u klasi XmlToJsonService.

JsonService jsonService = new JsonService();
jsonService.writeDataToJsonFile(filePathOut, roles, persons);

To je prvi proces. Unutarnja petlja uspoređuje svaku osobu s trenutnim ID-om uloge, što je način na koji ravni XML popis osoba postaje ugniježđeni JSON niz.

Pretvori JSON poruku u Java objekata koristeći Gson

U prvom koraku drugog postupka definiramo funkciju getDataFromJsonFile za čitanje podataka iz JSON datoteke. Ova je funkcija definirana u klasi JsonService.

Imajte na umu da za čitanje popisa JSON objekata koristimo funkcije početni niz() i endArray()Između ova dva poziva čitamo svaki 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) {

	}
}

Gornji kod pozivamo u klasi XmlToJsonService.

JsonService jsonService = new JsonService();
List<Role> roles = new ArrayList<>();
List<Person> persons = new ArrayList<>();

jsonService.getDataFromJsonFile(filePathIn, roles, persons);

pretvoriti Java objekata u XML poruku koristeći JAXB

U ovom koraku koristimo tehniku ​​marshallinga JAXB-a.

Marshalling pruža klijentskoj aplikaciji mogućnost pretvaranja JAXB izvedenog Java stablo objekata u XML podatke.

Definiramo funkciju parsirajObjectToXml organizirati Java objekt XML poruke. 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 pozivamo u klasi 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. Generirana datoteka odgovara originalnoj datoteci sample.xml, što potvrđuje da je kružno putovanje sačuvalo svaku vrijednost.

Kako pretvoriti JSON u XML u Java bez klase modela?

Gornji pristup je pravi izbor kada je struktura poznata i stabilna, jer anotirane klase dokumentiraju contract. Kada je struktura nepoznata ili se često mijenja, generički pretvarač je brži.

The org.json Biblioteka izvodi pretvorbu u dva retka, bez ikakve klase modela:

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);
    }
}

Izlaz:

<username>guru99user</username><email>guru99user@mail.com</email>

Imajte na umu da generička ruta ne proizvodi korijenski element niti atribute, stoga XML.toString(json, "root") obično je potrebno. Tablica u nastavku prikazuje dva pristupa jedan pored drugog.

Kriterij Gson s JAXB-om generička konverzija org.json
Potrebne klase modela Da Ne
Kontrola nad strukturom Puno, uključujući atribute Ograničeno, samo elementi
Rešaping datum Moguće, kao što je prikazano s ugniježđenim osobama Nije moguće
Linije koda Mnogi Dva
Najbolje za Stabilne, dokumentirane sheme Ad hoc ili nepoznate strukture

JAXB čita XML podatke, a Gson ih zapisuje u JSON, a obrnuti put koristi Gson za čitanje. JSON podatke dok ih JAXB zapisuje natrag u XML. Za daljnji pregled, pregledajte XML osnove, šire Java udžbeniki Jasper Reports, koji koristi oba formata kao izvore podataka izvješća.

Pitanja i odgovori

JAXB je uklonjen iz JDK-a godine Java 11. Dodajte API jakarta.xml.bind zajedno s runtime okruženjem kao što je jaxb-runtime i ažurirajte uvoze iz javaxa u jakarta.

Ne. Gson obrađuje samo JSON. XML prvo mora postati Java objekte putem JAXB-a ili putem drugog parsera kao što je Jackson XML, prije nego što ih Gson može serijalizirati.

XmlElement stvara podređenu oznaku koja sadrži vrijednost, dok XmlAttribute smješta vrijednost unutar početne oznake roditelja. Atributi ne mogu sadržavati ugniježđene strukture.

Streaming održava nisku upotrebu memorije i omogućuje da se izlazna struktura razlikuje od ulaznih klasa, što se upravo događa kada su osobe ugniježđene unutar uloga ovdje.

Da, iz uzorka XML dokumenta. Provjerite napomene omotača na kolekcijama, jer generirane klase često izostavljaju XmlElementWrapper i stvaraju spljoštenu strukturu.

JSON i njegova varijanta razdvojena linijama dominiraju jer se izravno mapiraju na Python rječnike i učinkovito strujati. XML se i dalje pojavljuje tamo gdje naslijeđeni poslovni sustavi daju izvorne podatke.

Sažmite ovu objavu uz: