Convertir JSON en XML Java utilisation de Gson et JAXB

⚡ Résumé intelligent

Convertir JSON en XML Java utilisation de Gson et JAXB par carteping les deux formats sur la même annotation Java Cet article définit chaque format, configure le projet, désérialise le XML avec JAXB, écrit du JSON avec Gson et inverse le processus.

  • 🇧🇷 Structure JSON : Les données sont stockées sous forme de paires clé-valeur entre accolades, chaque entrée étant séparée par une virgule.
  • 🏷️ Structure XML : Les données sont stockées dans des nœuds imbriqués, où chaque balise ouvrante nécessite une balise fermante correspondante.
  • 🔗 Modèle partagé : Un ensemble d'annotations Java Les classes servent de pont, de sorte qu'aucun format n'est analysé directement dans l'autre.
  • (I.e. Désorganisation : JAXB lit un fichier XML et renvoie un objet rempli. Java Arborescence d'objets via la classe Unmarshaller.
  • 📤 Écriture en continu : Le Gson JsonWriter Émet du JSON de manière incrémentale avec les appels beginObject, name, value et endObject.
  • (I.e. Reverse Chemin: JsonReader reconstruit les objets à partir de JSON, et le Marshaller JAXB les réécrit au format XML.
  • ⚠️ Note relative à l'exécution : JAXB a quitté le JDK à Java 11, la dépendance jakarta.xml.bind doit donc être ajoutée explicitement.

Convertir JSON en XML dans Java

Qu'est-ce que JSON?

JSON est une abréviation de JavaJSON (Script Object Notation) est un format de données conforme à des règles lisibles par la plupart des langages de programmation. Il est facile de l'enregistrer dans un fichier ou de le stocker dans une base de données. Le format JSON utilise des paires clé-valeur pour décrire les données.

Dans l'exemple suivant, nous définissons une chaîne JSON qui stocke des informations personnelles :

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

La syntaxe de JSON est donc très simple. Chaque donnée comporte deux parties : une clé et une valeur, qui correspondent au nom du champ et à sa valeur dans un enregistrement. En y regardant de plus près, on trouve quelques règles comme celles-ci :

  • La chaîne JSON est entourée d'accolades {}.
  • Les clés JSON doivent être placées entre guillemets doubles, et les valeurs de type chaîne de caractères doivent également être entre guillemets.
  • S'il y a plus de données (plus de paires clé => valeur), nous utilisons des virgules (,) pour les séparer.
  • Les clés JSON doivent utiliser des lettres simples, des chiffres ou le caractère de soulignement, sans espaces, et le premier caractère ne doit pas être un chiffre.

Qu'est-ce que XML?

XML signifie eXtensible Markup Language, proposé par le World Wide Web Consortium (https://www.w3.org/) pour créer d'autres langages de balisage. Il s'agit d'un sous-ensemble simple capable de décrire de nombreux types de données différents, ce qui le rend très utile pour le partage de données entre systèmes.

Les balises en XML ne sont souvent pas prédéfinies, mais elles sont créées selon les conventions utilisateur. XML introduit de nouvelles fonctionnalités basées sur les avantages du HTML.

Il existe des fonctionnalités XML utiles pour divers systèmes et solutions :

  • XML est extensible : XML vous permet de créer vos propres balises personnalisées en fonction de votre application.
  • Le XML transporte des données, il ne les affiche pas : le XML permet de stocker des données indépendamment de la manière dont elles seront affichées.
  • XML est un standard commun : XML a été développé par le World Wide Web Consortium (W3C) et est disponible en tant que standard ouvert.

XML est construit sur une structure de nœuds imbriqués. Chaque nœud possède une balise ouvrante et une balise fermante, comme suit :

<node>content</node>

Dans lequel:

  • est une balise ouverte, et c'est vous qui définissez le nom de cette balise.
  • est une balise de fermeture, et le nom de cette balise doit correspondre au nom de la balise d'ouverture.
  • contenu est le contenu de cette balise.

En haut de chaque fichier XML, vous devez déclarer une balise indiquant la version XML utilisée. La syntaxe de cette balise est la suivante :

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

JSON vs XML : Principales différences

Les deux formats contiennent des données structurées, et le tableau ci-dessous indique pourquoi un projet peut nécessiter de passer de l'un à l'autre.

Paramètres JSON XML
Style de syntaxe paires clé-valeur Étiquettes imbriquées
Types de données Chaîne de caractères, nombre, booléen, null, tableau, objet Texte uniquement, les types proviennent d'un schéma
Attributs Non pris en charge Prise en charge sur n'importe quel élément
Commentaires Non pris en charge Appareils
Verbosité Compact Plus verbeux car les balises se répètent
Validation du schéma Schéma JSON, optionnel DTD et XSD, mature
Utilisation typique API Web et configuration Messagerie et documents d'entreprise

Qu’est-ce que Gson ?

Gson (https://github.com/google/gson) est un Java bibliothèque qui permet aux utilisateurs de convertir un Java un objet vers une chaîne JSON, et également reconvertir une chaîne JSON en un objet Java objet. Gson peut travailler avec arbitraire Java objets, y compris des objets existants dont vous ne possédez pas le code source.

Depuis la version 1.6, Gson introduit deux classes, JsonReader et JsonWriter, pour assurer le traitement en flux continu des données JSON.

  • JsonWriter – Écriture en flux continu au format JSON. Nous créons un JsonWriter objet. Pour créer et terminer un objet JSON, nous utilisons les fonctions commencerObject() et objetfin()Entre ces deux appels, nous écrivons les données sous forme de paires (clé => valeur).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
  • JsonReader – Lecture en flux continu depuis un objet JSON. Nous créons un objet JsonReader. Pour démarrer et terminer la lecture d'un objet JSON, nous utilisons les fonctions beginObject() et endObject(). Entre ces deux appels, nous lisons les données sous forme de paires clé-valeur.
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
	String name = reader.nextName();
	if (name.equals("key")) {
		String value = reader.nextString();
	}
}
reader.endObject();

Le traitement de flux Gson est rapide. Cependant, vous devez traiter vous-même chaque paire (clé => valeur) de données JSON.

Qu'est-ce que JAXB ?

JAXB signifie Java Architecture pour XML Binding, qui est une bibliothèque qui utilise des annotations pour convertir Java JAXB permet de convertir des objets en contenu XML et inversement. Comme JAXB est défini par une spécification, différentes implémentations de cette norme peuvent être utilisées.

Avec JAXB, nous utilisons souvent les annotations de base suivantes :

  • @XmlRootElementCette annotation spécifie la balise la plus externe du fichier XML et est donc déclarée au-dessus d'une classe.
  • @XmlElementWrapper: Cette annotation crée un élément XML wrapper autour des collections.
  • @XmlElementCette annotation déclare qu'une propriété de l'objet devient une balise enfant du fichier XML.
  • @XmlAttributeCette annotation déclare qu'une propriété de l'objet devient un attribut de la balise englobante.

La mise en œuvre générale est la suivante. Premièrement, nous initialisons le JAXBContexte objet avec le MonObjet classe à convertir.

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

Ce JAXBContexte L'objet possède une méthode qui crée un objet convertissant le contenu XML en un Java l'objet, l' Démarécheur.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

Le même JAXBContexte L'objet possède également une méthode qui crée l'objet qui convertit un Java objet dans le contenu XML, le maréchal.

Marshaller marshallerObj = jaxbContext.createMarshaller();

⚠️ Attention : JAXB a été supprimé du JDK dans Java 11. Sur Java 11 et versions ultérieures, ajoutez explicitement l'API et une implémentation d'exécution au projet, par exemple : jakarta.xml.bind:jakarta.xml.bind-api avec org.glassfish.jaxb:jaxb-runtime, et importez les annotations depuis jakarta.xml.bind.annotation au lieu de javax.xml.bind.annotation.

Comment convertir XML en JSON ?

Nous illustrons la conversion XML vers JSON sur la plateforme suivante. Les versions ci-dessous sont celles utilisées pour les captures d'écran. Les versions plus récentes du JDK, Eclipse, et Gson fonctionnent de la même manière, sous réserve de la note JAXB ci-dessus.

  • OpenJDK 8 pour Ubuntu 18.04 x64.
  • Eclipse IDE 2019-03 (4.11.0) x64 Java Développement pour Ubuntu.
  • Gson 2.8.5.

Étape 1) Créer un projet.
Créer un nouveau Java .

Créer un nouveau Java Projet.

Étape 2) Définir le nom du projet.
Définissez le nom du projet sur XmlVersJsonExemple.

Définir le nom du projet

Étape 3) Créez un dossier.
Créer le dossier entrée de données contenant les deux fichiers exemple.xml et exemple.json.

Créer des données de dossier

Définissons d'abord notre XML avec département, rôle de l' et personne .

L'architecture générale est la suivante : un département comprend plusieurs rôles, et un rôle implique plusieurs personnes. Le diagramme ci-dessous illustre ces relations.

Relations d'objet

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

Deuxièmement, nous définissons le JSON qui exprime la même idée. Remarquez que la liste plate de personnes devient un tableau imbriqué dans chaque rôle, ce qui correspond exactement à la transformation effectuée par le code de conversion.

{
	"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"
				}
			]
		}
	]
}

Étape 4) Définir les objets.
Définissez les classes d'objets correspondantes dans le package modèle.

Définir des classes d'objets

Rôle.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;
	}
}

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

Département.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;
	}

}

Étape 5) Mettre en place la bibliothèque.
Ajoutez et configurez la bibliothèque Gson 2.8.5 dans le Java Construire un chemin.

Configurer la bibliothèque Gson

Ajouter la bibliothèque Gson 2.8.5 dans Java Chemin de construction

Si le projet utilise Maven Au lieu d'ajouter manuellement un fichier JAR, les mêmes bibliothèques sont déclarées comme dépendances. La version 2.8.5 est utilisée ici pour correspondre aux captures d'écran, et toute version ultérieure de Gson fonctionne de manière identique pour cet exemple :

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

Convertir un message XML en Java objets utilisant JAXB

Tout d'abord, nous définissons les classes performantes du package service.

Définir des classes performantes

Dans la première étape du premier processus, nous utilisons la technique de désérialisation de JAXB.

La désérialisation permet à une application cliente de convertir des données XML en données dérivées de JAXB. Java objets.

Nous définissons la fonction getObjectFromXmlFile pour désérialiser notre fichier XML en un Java objet. Cette fonction est définie dans la classe Service XML.

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

Nous appelons le code ci-dessus dans la classe XmlVersJsonService.

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

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

À ce stade, le fichier XML est devenu trois Java Les objets sont stockés en mémoire. L'étape suivante consiste à les écrire au format JSON.

Convertir Java objets dans un message JSON en utilisant Gson

À cette étape, nous définissons la fonction writeDataToJsonFile pour écrire des données dans le fichier JSON. Cette fonction est définie dans la classe JsonService.

Notez que pour écrire une liste d'objets JSON, nous utilisons les fonctions commencerArray() et finArray()Entre ces deux appels, nous écrivons chaque objet JSON.

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

Nous appelons le code ci-dessus dans la classe XmlVersJsonService.

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

Voici la première étape. La boucle interne compare chaque personne à l'identifiant de rôle actuel, ce qui permet de transformer la liste XML plate de personnes en un tableau JSON imbriqué.

Convertir le message JSON en Java objets utilisant Gson

À la première étape du deuxième processus, nous définissons la fonction getDataFromJsonFile pour lire les données du fichier JSON. Cette fonction est définie dans la classe JsonService.

Notez que pour lire une liste d'objets JSON, nous utilisons les fonctions commencerArray() et finArray()Entre ces deux appels, nous lisons chaque objet JSON.

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

	}
}

Nous appelons le code ci-dessus dans la classe XmlVersJsonService.

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

jsonService.getDataFromJsonFile(filePathIn, roles, persons);

Convertir Java objets en message XML en utilisant JAXB

À cette étape, nous utilisons la technique de sérialisation de JAXB.

Le marshaling permet à une application cliente de convertir un flux JAXB dérivé Java arborescence d'objets en données XML.

Nous définissons la fonction analyserObjectToXml pour rassembler le Java objet vers un message XML. Cette fonction est définie dans la classe Service XML.

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

Nous appelons le code ci-dessus dans la classe XmlVersJsonService.

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

Il s'agit de la deuxième étape. Le fichier généré correspond au fichier sample.xml d'origine, ce qui confirme que l'aller-retour a préservé toutes les valeurs.

Comment convertir du JSON en XML ? Java sans classe de modèle ?

L'approche décrite ci-dessus est le bon choix lorsque la structure est connue et stable, car les classes annotées documentent la configuration.tract. Lorsque la structure est inconnue ou change souvent, un convertisseur générique est plus rapide.

Le org.json La bibliothèque effectue la conversion en deux lignes, sans aucune classe de modèle :

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

Sortie :

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

Notez que la route générique ne produit ni élément racine ni attributs, donc XML.toString(json, "root") est généralement nécessaire. Le tableau ci-dessous compare les deux approches.

Critère Gson avec JAXB conversion générique org.json
Classes de modèles requises Oui Non
Contrôle de la structure Complet, y compris les attributs Éléments limités
Reshaping données, Possible, comme le montrent les personnes imbriquées Pas possible
Lignes de code Merci beaucoup Deux
Meilleur pour Schémas stables et documentés structures ad hoc ou inconnues

JAXB lit des données XML et Gson les écrit au format JSON, et le processus inverse utilise Gson pour lire les données. JSON Les données sont traitées par JAXB, qui les réécrit au format XML. Pour en savoir plus, consultez la section « Consulter ». XML fondamentaux, le plus large Java tutoriel et JasperRapports, qui utilise les deux formats comme sources de données de rapport.

FAQ

JAXB a été supprimé du JDK dans Java 11. Ajoutez l'API jakarta.xml.bind avec un environnement d'exécution tel que jaxb-runtime, et mettez à jour les importations de javax vers jakarta.

Non. Gson ne gère que le JSON. Le XML doit d'abord être converti. Java les objets via JAXB, ou via un autre analyseur tel que Jackson XML, avant que Gson puisse les sérialiser.

XmlElement crée une balise enfant contenant la valeur, tandis que XmlAttribute place la valeur à l'intérieur de la balise ouvrante de l'élément parent. Les attributs ne peuvent pas contenir de structures imbriquées.

Le streaming permet de limiter l'utilisation de la mémoire et autorise une structure de sortie différente des classes d'entrée, ce qui se produit précisément lorsque des personnes sont imbriquées dans des rôles.

Oui, à partir d'un exemple de document XML. Vérifiez les annotations d'encapsulation sur les collections, car les classes générées omettent souvent XmlElementWrapper et produisent une structure aplatie.

JSON et sa variante délimitée par lignes dominent, car ils correspondent directement à Python Les dictionnaires et les flux sont gérés efficacement. Le format XML reste présent lorsque les systèmes d'entreprise existants fournissent les données sources.

Résumez cet article avec :