Les deux modèles ne s'alignent pas : RFC 8259 définit six types JSON sans attributs, tandis que XML 1.0 a des attributs, des espaces de noms et un contenu mixte ordonné Aller dans cette direction signifie choisir quoi faire de la différence.
La première fois que j'ai dû envoyer des données JSON dans un système qui ne parlait que XML, j'ai fait la chose naïve : j'ai écrit à la main les crochets angulaires dans un éditeur de texte C'était un flux fournisseur qui s'attendait à une enveloppe SOAP-ish, et ma source était un tableau JSON bien rangé sortant d'une API Laravel Vingt minutes plus tard, j'avais dépareillé une balise de fermeture quelque part autour du quarantième enregistrement et l'analyseur récepteur a lancé un " ; jonque après élément de document" ; erreur qui ne m'a rien dit alors que. Ce soir-là m'a appris une leçon que j'ai appliquée sur chaque intégration depuis : convertir entre JSON et XML n'est pas un acte créatif C'est un problème de cartographie avec un petit nombre de règles, et au moment où vous écrivez ces règles, le tout devient mécanique.
Ce guide est la version de ce mappage que j'aimerais avoir I' ; j'ai. Je construis [Toolz.dev](/, et l'un des outils est basé sur un navigateur Convertisseur JSON en XML cela s'applique exactement aux conventions ci-dessous. Mais le but de cet article n'est pas le bouton - it' ; c'est la compréhension pourquoi une clé devient un élément, pourquoi un @-la clé préfixée devient un attribut, et pourquoi un tableau se transforme en balises répétées plutôt qu'en liste numérotée Une fois que ces trois idées cliquent, vous pouvez convertir n'importe quel JSON en XML à la main si vous le devez, et vous pouvez déboguer la sortie lorsqu'un système en aval le rejette.
tl;dr : Pour convertir JSON en XML, mappez chaque clé d'objet sur un élément, chacun
@-clé préfixée à un attribut sur son élément parent, et le#textclé du contenu du texte element' ; s. Élargissez chaque tableau en éléments frères et sœurs répétés qui partagent la clé' ; s nom. Échapper&,<, et>en texte (plus"dans les valeurs d'attribut), et assainir toute clé qui est & #39 ; t un nom XML légal Faites-le dans le navigateur pour que les charges utiles avec des jetons ou des données client ne quittent jamais votre machine.
Pourquoi convertiriez-vous JSON en XML en premier lieu ?
JSON a gagné la guerre des API Web il y a des années, et si vous passez vos journées dans React, Laravel ou Node, vous pourriez raisonnablement vous demander quand vous et n°39 ; avez déjà besoin de XML du tout La réponse est : constamment, tout simplement pas aux endroits où vous regardez XML est la lingua franca d'une énorme base installée de systèmes antérieurs à l'ère JSON et qui ne vont nulle part Les services Web SOAP - toujours l'épine dorsale des intégrations bancaires, d'assurance, de logistique et de gouvernement - transportent leurs charges utiles en XML Les flux RSS et Atom sont XML. Les sitesmaps sont XML. Les mises en page Android, toujours l'éponge .docx et .xlsx les composants internes (Office Open XML), SVG, flux de podcast RSS et d'innombrables échanges de style B2 B EDI sont tous XML.
Le scénario du monde réel a donc presque toujours la même forme : vous disposez de données à JSON parce que c'est ce que produit votre pile et vous en avez besoin à XML parce que ça' ; c'est ce que l'autre côté demande Peut-être vous' ; poussez les données du produit sur un marché qui n'accepte qu'un flux XML Peut-être vous' ; remballez une réponse API dans un corps SOAP Peut-être vous' ; générez un flux RSS à partir d'une exportation de contenu JSON Dans tous les cas, vous ne voulez pas réinventer la sérialisation à chaque fois - vous voulez une règle prévisible qui transforme n'importe quelle structure JSON en XML valide, afin que vous puissiez l'automatiser et arrêter d'y penser.
There' ;s aussi une raison plus calme : lisibilité lors du débogage Lorsque vous' ; regardez un blob JSON profondément imbriqué essayant de comprendre une hiérarchie, la conversion en XML en retrait fait parfois sauter la structure arborescente, car XML' ; s les balises ouvertes/fermées rendent l'imbrication explicite de manière à ce que JSON' ; s accolade don' ; t. Je garde le Convertisseur JSON en XML et l'inverse Convertisseur XML en JSON ouvrez dans les onglets adjacents plus souvent que I' ; j'aurais deviné.
Comment JSON mappe-t-il au XML, exactement ?
En voici le noyau Il n'y a que quatre règles, et tout le reste est un détail.
Règle 1 : Les clés d'objet deviennent des éléments. Un objet JSON { "book": { "title": "..." } } se transforme <book><title>...</title></book>. La clé est le nom de la balise ; la valeur est ce qui entre.
Règle 2 : @-les clés préfixées deviennent des attributs. Les éléments XML peuvent transporter des attributs, et JSON n'a aucun concept natif de ceux-ci, nous avons donc besoin d'une convention Celui qui est largement utilisé - et celui que mon outil utilise - est un caractère de préfixe, donc @ par défaut. Donc { "book": { "@id": "bk101", "title": "..." } } se transforme <book id="bk101"><title>...</title></book>. Les attributs ne peuvent contenir que des valeurs primitives (chaînes, nombres, booléens), des structures jamais imbriquées, qui correspondent au fonctionnement réel des attributs XML.
Règle 3 : Le #text la clé devient un contenu textuel. Lorsqu'un élément a besoin l'un et attributs et texte - pensez <title lang="en">Hello</title> - vous pouvez' ; t exprimer cela avec une valeur de chaîne simple, car la chaîne ne laisse aucune place à l'attribut La convention est une clé réservée, #text: { "title": { "@lang": "en", "#text": "Hello" } }. Si un élément n'a que du texte et aucun attribut, vous pouvez sauter #text et utilisez simplement une valeur de chaîne simple.
Règle 4 : Les tableaux deviennent des éléments répétés. C'est celui que les gens se trompent le plus souvent XML n'a pas de type de tableau Une liste de choses est exprimée comme des éléments frères et sœurs répétés avec le même nom de balise Donc { "tags": { "tag": ["computer", "web"] } } se transforme <tags><tag>computer</tag><tag>web</tag></tags> - pas <tag>0</tag> ou n'importe quelle absurdité basée sur un index. Le tableau' ;s clé fournit le nom répété de la balise.
Rassemblez-les sur un objet réaliste et la sortie correspond exactement à ce qu'attend un analyseur XML en aval :
{
"catalog": {
"book": [
{ "@id": "bk101", "author": "Gambardella, Matthew", "price": 44.95 },
{ "@id": "bk102", "author": "Ralls, Kim", "price": 5.95 }
]
}
}
se transforme
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<price>44.95</price>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<price>5.95</price>
</book>
</catalog>
Notez que la clé unique de niveau supérieur, catalog[traduction], est devenu l'élément racine document' ; s. That' ; s deliberate : un document XML bien formé doit avoir exactement une racine Lorsque votre JSON a déjà une seule clé d'emballage, cette clé est la racine. Quand il fait & #39 ; t - quand vous remettez au convertisseur un objet multi-clés ou un tableau nu - l'outil enveloppe le tout sous un élément racine configurable (en anglais)root par défaut) donc la sortie reste bien formée.
Qu'en est-il des noms d'évasion et invalides ?
Deux choses brisent discrètement plus de conversions que n'importe quel bug de nidification : les caractères spéciaux non échappés et les noms d'éléments illégaux.
Échapper. XML réserve une poignée de caractères Inside element text, (« texte de l'élément intérieur ») &, <, et > doit être écrit comme &, <, et >. À l'intérieur d'une valeur d'attribut à double citation, vous devez en outre échapper à la citation double comme ". Si votre chaîne JSON contient Tom & Jerry et vous le déposez dans XML brut, l'esperluette nue rend le document mal formé et l'analyseur meurt Un convertisseur correct s'échappe automatiquement, donc "a < b & c" se transforme a < b & c dans la sortie et les allers-retours pour revenir au texte original lorsqu'il est analysé. Ce n'est pas un poli facultatif - it' ; c'est la différence entre XML valide et non valide.
Noms d'éléments. XML a des règles strictes sur ce que peut contenir un nom de balise Les noms peuvent' ; t incluent des espaces, can' ; t commencent par un chiffre, un trait d'union ou un point, et excluent la plupart des ponctuations Les clés JSON n'ont pas de telles restrictions - "first name", "123", et "total($)" sont toutes des clés JSON parfaitement légales et tous les noms XML illégaux Un convertisseur qui ignore cela produit des documents qu'aucun analyseur n'acceptera Le correctif pragmatique, et ce que fait mon outil, est de désinfecter : remplacer les caractères illégaux par des traits de soulignement et ajouter un trait de soulignement lorsqu'un nom commence par un chiffre Alors "123 bad" se transforme <_123_bad>. It' ; n'est pas glamour, mais il garantit les analyses de sortie, qui sont le point entier.
Comment utiliser le convertisseur basé sur un navigateur ?
Le flux de travail sur Toolz.dev/outils/json-to-xml reflète les règles ci-dessus, avec quelques options pour les cas pratiques.
Collez votre JSON dans l'entrée et appuyez sur Convertir Si votre JSON est mal formé, vous obtenez une erreur d'analyse claire plutôt que des déchets silencieux - je m'appuie sur le navigateur & #39 ; propre JSON.parse[TRADUCTION], donc les messages d'erreur correspondent à ce que vous et n° 39 ; verriez dans votre console Choisissez 2 ou 4 espaces d'indentation lorsque vous voulez un document lisible par l'homme pour examen, ou choisissez Minify pour réduire le tout sur une seule ligne lorsque vous et n° 39 ; l'expédiez sur le fil et que chaque octet compte (demandes SOAP et charges utiles de flux en particulier). Définissez le nom de l'élément racine pour le cas où votre JSON n'a pas de clé d'emballage unique Basculez la déclaration XML (Toggle the XML declaration)<?xml version="1.0" encoding="UTF-8"?>) allumé ou éteint selon que le consommateur s'attend à un prologue. Et décidez si les nœuds vides doivent se fermer automatiquement <tag/> ou développez-vous pour <tag></tag> - certains consommateurs stricts s'en soucient.
Tout fonctionne côté client Le convertisseur est un sérialiseur sans dépendance écrit en TypeScript, pas un wrapper autour d'une API distante Cela compte plus que cela ne sonne : les réponses API et les fichiers de configuration contiennent régulièrement des jetons d'accès, des enregistrements clients et des identifiants internes, et un " ; convertisseur et devis en ligne gratuits ; qui PUBLIe votre charge utile sur quelqu'un' ; son serveur est une fuite de données en attente de se produire Parce que celui-ci ne passe jamais d'appel réseau, vous pouvez convertir des données sensibles en toute sécurité, et il continue de fonctionner sans aucune connexion. Si la confidentialité dans les outils de navigateur est quelque chose à laquelle vous pensez - et si vous gérez les données de vous & #39 ; il devrait être - et si vous en ce que je le cas dans les données Guide des outils de confidentialité des données.
JSON vs XML : une comparaison rapide
Cela aide à conserver les deux formats & #39 ; des compromis en vue, car le raison la cartographie a besoin de conventions comme @ et #text est-ce que XML peut exprimer des choses JSON can' ; t, et vice versa.
| Aspect | JSON | XML |
|---|---|---|
| attributs | Pas de concept natif | Première classe (<tag attr="v">) |
| Tableaux/listes | Natif [ ] taper à la |
Éléments frères et sœurs répétés |
| observation | Non autorisé | <!-- ... --> soutenu |
| Espaces de noms | nul | Prise en charge complète de l'espace de noms |
| Contenu mixte (texte + éléments) | Maladroit | Natif |
| Schéma/validation | Schéma JSON (add-on) | XSD, DTD, RELAX NG (mature) |
| verbosité | Compact | Plus verbeux (balises de fermeture) |
| Utilisation typique aujourd'hui | API Web, config | SAVON, flux, documents, entreprise |
le @ le préfixe existe pour relier " ; attributs" ; rangée ; la règle des balises répétées relie le " ; tableaux" ; rangée ; et #text relie la ligne " ; contenu mixte" ; Une fois que vous voyez le mappage comme un pont entre ces espaces spécifiques, il cesse de se sentir arbitraire.
Est-ce que JSON à XML aller-retour proprement ?
Surtout, oui - et ça' ;s par conception. Mon JSON vers XML et XML vers JSON les outils partagent la même chose @ préfixe d'attribut et #text clé de contenu, donc la conversion XML → JSON et retour reproduit généralement le document original Si vous et #39 ; construisez un pipeline qui doit déplacer les données dans les deux sens, cette symétrie vaut la peine de s'appuyer sur.
Où le round-tripping devient flou est le même endroit où chaque mappage JSON/XML devient flou : ordre et contenu mixte Les objets JSON sont officiellement non ordonnés, de sorte qu'un convertisseur peut ne pas préserver l'ordre fraternel exact des éléments nommés différemment XML qui entrelace le texte et les éléments fils (en anglais)<p>Hello <b>world</b>!</p>) n'a pas & n° 39 ; n'a pas une représentation JSON propre et revient en approximation Et un élément qui apparaît parfois une fois et apparaît parfois plusieurs fois est ambigu - est-ce une valeur unique ou un tableau d'une ? ces bugs aren' ; t dans un outil particulier ; ils' ; sont inhérents au fait que les deux modèles de données don' ; t se chevauchent parfaitement Savoir où sont les coutures vous permet de concevoir votre JSON pour que la conversion reste sans perte : soyez cohérent quant à savoir si une chose est toujours un tableau, et évitez les contenus mixtes là où vous le pouvez.
Si vous travaillez beaucoup avec JSON, it' ; cela vaut la peine de développer la maîtrise de toute la famille des conversions - j'ai rassemblé celles que j'atteins pour la plupart dans le Guide ultime des outils JSON: et le plus large Guide des outils de codage couvre où les convertisseurs de format s'intègrent dans un flux de travail quotidien Pour le sens inverse et les formats adjacents, le Convertisseur JSON en YAML et une plaine Formateur JSON complétez l'ensemble.
Erreurs courantes lors de la conversion de JSON en XML
Quelques pièges I' ; j'ai frappé ou vu d'autres frapper :
Traiter les indices de tableau comme des noms de balises. Si vous voyez <item0>, <item1> dans quelqu'un' ; s sortie, ils ont mal construit le convertisseur Les tableaux deviennent répété tags avec le même nom, tiré du tableau' ; clé s.
Oublier qu'il ne peut y avoir qu'une seule racine. La remise d'un objet multi-clés directement à un sérialiseur sans l'envelopper produit plusieurs éléments de niveau supérieur, ce qui n'est pas un document bien formé Enroulez-le.
Sauter l'échappement de " ; parce que les données semblent propres." ; Il semble propre jusqu'à ce qu'une description de produit contienne un esperluette ou un <. Toujours s'échapper ; ne jamais supposer.
Mise de données structurées dans des attributs. Les attributs détiennent des primitives Si vous essayez de pousser un objet imbriqué dans un @-clé préfixée, un convertisseur correct la laissera tomber (et devrait) ou l'ignorera, car il n'y a pas de XML valide pour elle. Modélisez-le plutôt comme un élément enfant.
Avancé : choisir l'indentation et la déclaration pour le consommateur
Une habitude qui m'a sauvé des allers-retours répétés avec les partenaires d'intégration : faire correspondre le résultat exactement à ce que le consommateur attend, puis arrêtez Certains points de terminaison SOAP rejettent un document qui comprend une marque de commande d'octets ou un prolog inattendu ; d'autres exigent le <?xml ... ?> déclaration et 415 vous sans. Certains validateurs de flux veulent un XML joliment imprimé et en retrait pour leur propre débogage ; la plupart des transports de production veulent qu'il soit minifié Plutôt que d'argumenter, je génère la variante demandée par la spécification. That' ; s pourquoi le convertisseur expose l'indentation (y compris une option minify), la déclaration bascule et le comportement d'auto-fermeture comme contrôles de première classe - ils' ; ce n'est pas de la décoration, ils' ; sont les boutons qui déterminent si un consommateur pointilleux accepte votre document du premier coup.
FAQ
Comment convertir JSON en XML ?
Collez votre JSON dans l'éditeur et appuyez sur Convertir Les touches d'objet deviennent des éléments XML, les tableaux deviennent des balises répétées et le résultat apparaît prêt à être copié ou téléchargé Il n'y a pas de téléchargement - la conversion se produit dans votre navigateur.
Comment les attributs JSON sont-ils représentés en XML ?
Par convention, toute clé d'objet qui commence par le " ;@" ; préfixe est écrite comme un attribut sur son élément parent plutôt que comme un élément enfant Par exemple, {" ;book" ; : {" ;@id" ; : " ;bk101" ;, " ;title" ; : " ;..." ;}} devient
Comment le convertisseur gère-t-il les baies JSON ?
Chaque élément d'un tableau est émis comme un élément frère répété partageant la clé' ; s nom Donc {" ; tags" ; : {" ; tag" ; : [" ; a" ;, " ; b" ;]}} produit
A quoi sert la clé #texte ?
Lorsqu'un élément a besoin à la fois d'attributs et de contenu textuel, le texte est stocké sous la touche " ; #text" ; {" ; title" ; : {" ;@lang" ; : " ;en" ;, " ;#text" ; : " ;Hello" ;}} devient
Puis-je obtenir du XML minifié au lieu d'une sortie en retrait ?
Oui. Définissez l'indentation sur 0 (minify) et le convertisseur émet le document entier sur une seule ligne sans espace blanc entre les balises. Ceci est utile pour les requêtes SOAP ou les flux où la taille de la charge utile est importante ; retournez à 2 ou 4 espaces lorsque vous avez besoin d'un document lisible.
Qu'advient-il des clés qui ne sont pas des noms d'éléments XML valides ?
Les noms d'éléments XML ne peuvent pas contenir d'espaces, ne peuvent pas commencer par un chiffre, un trait d'union ou une période et exclure la plupart des ponctuations Les clés qui enfreignent ces règles sont nettoyées - les caractères non valides deviennent des traits de soulignement et un trait de soulignement principal est ajouté en cas de besoin - de sorte que la sortie analyse toujours, même si vos clés JSON n'étaient pas conviviales pour XML.
Est-ce que JSON vers XML aller-retour avec l'outil XML vers JSON ?
Pour les structures communes qu'il fait Cet outil et l'outil XML vers JSON partagent le même " ;@" ; préfixe d'attribut et " ;#text" ; clé de contenu, donc la conversion de XML vers JSON et retour reproduit généralement le même document Les détails indépendants de l'ordre et le contenu mixte sont les sources habituelles de petites différences, comme ils le sont avec n'importe quel mappage XML/JSON.
Est-il sûr de convertir des JSON sensibles ici ?
Oui. Le convertisseur est un JavaScript simple qui s'exécute entièrement dans votre navigateur - rien de ce que vous collez n'est transmis à un serveur, enregistré ou stocké. Cela le rend sûr pour les réponses API, les fichiers de configuration et les enregistrements contenant des jetons ou des données personnelles, et il continue de fonctionner sans connexion réseau.



