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.

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 .
รtape 2) Dรฉfinir le nom du projet.
Dรฉfinissez le nom du projet sur XmlVersJsonExemple.
รtape 3) Crรฉez un dossier.
Crรฉer le dossier entrรฉe de donnรฉes contenant les deux fichiers exemple.xml et exemple.json.
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.
<?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.
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.
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.
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.








