Convertir XML en JSON
XML vers JSON convertit un document dans votre navigateur. Il n’existe pas de mappage canonique entre les deux formats, donc chaque décision est une option plutôt qu’une valeur par défaut silencieuse — la plus importante est la liste de forçage en tableau, parce que XML ne peut pas distinguer une liste à un élément d’une valeur unique et qu’aucun convertisseur ne peut le déduire.
Comment fonctionne Convertir XML en JSON ?
XML et JSON ne décrivent pas les mêmes formes, donc il n’existe pas une seule traduction correcte entre eux. Un convertisseur qui en présente une quand même cache quatre décisions, chacune capable de corrompre vos données en silence.
Le problème de l’élément unique, qui ne se déduit pas
XML n’a pas de tableaux. <line/><line/> est deux éléments ; <line/> en est un. Un convertisseur transforme donc les éléments répétés en tableau et laisse un élément isolé en scalaire — ce qui fait que le même endpoint produit {"line": {…}} pour une commande d’une ligne et {"line": [{…}, {…}]} pour une commande de deux. Du code écrit contre la seconde plante sur la première, en production, le jour où un client commande un seul article.
Ce problème ne se résout pas par inférence. L’information nécessaire — cet élément est-il une collection ? — vit dans le schéma, pas dans l’instance. La correction honnête, c’est la liste de forçage en tableau : nommez les éléments qui sont des collections et ils seront toujours des tableaux, quel que soit leur nombre dans le document aujourd’hui.
Où ranger les attributs
<line sku="X"><sku>Y</sku></line> a un attribut et un élément enfant de même nom. Les fusionner en perd un. Le préfixe — @ par défaut — garde les deux, au prix de clés un peu pénibles à taper en JavaScript. Réglez-le sur vide pour les fusionner et accepter la collision.
XML n’a pas de types
<qty>3</qty> est la chaîne "3". La convertir en nombre est une supposition, et c’est la supposition qui transforme la référence 007 en 7 et le code postal 01970 en 1970. L’analyse des valeurs est donc désactivée par défaut, et quand elle est active, un zéro initial garde la valeur en chaîne — de toute façon, la grammaire JSON interdit les zéros initiaux, donc il n’y a rien à perdre.
Le contenu mixte ne survit pas
<p>before<b>bold</b>after</p> a du texte avant et après un enfant. Les objets JSON n’ont pas d’ordre, donc les deux morceaux de texte sont joints sous une même clé et leur position relative à <b> est perdue. Rien ne peut corriger cela ; le XML en forme de document n’est pas en forme de données, et le convertir en JSON est le mauvais geste plutôt qu’une conversion avec perte.
L’entrée malformée est rejetée, pas devinée
Les balises mal appariées et les éléments non fermés produisent une erreur nommant la balise et la ligne. Un convertisseur qui accepte <a><b></a> et émet un JSON d’apparence plausible est pire qu’un convertisseur qui échoue, parce que la personne qui colle du XML tronqué n’apprend jamais qu’il était tronqué.
XML
<order id="1"> <line sku="A">Widget</line> </order>
JSON
{
"order": {
"@id": "1",
"line": {
"@sku": "A",
"#text": "Widget"
}
}
}
// with "line" forced: "line": [ … ]Quelles options et quels cas limites Convertir XML en JSON prend en charge ?
| Paramètre | Type | Valeur par défaut | Comportement et cas limites |
|---|---|---|---|
| Forcer en tableau | noms d’éléments | (aucun) | Les noms listés ici sont toujours des tableaux, même avec une seule occurrence. L’option la plus importante de toutes : c’est le seul remède au problème de la liste à un élément, et on ne peut pas le déduire du document. |
| Préfixe d’attribut | string | @ | Garde les attributs distincts des éléments enfants de même nom. Laissez-le vide pour les fusionner, en acceptant qu’un seul gagne en cas de collision. |
| Clé de texte | string | #text | Où va le texte d’un élément quand il a aussi des attributs ou des enfants. Un élément qui n’a que du texte devient une simple chaîne. |
| Analyser les valeurs | booléen | désactivé | Convertit "3" en 3, "true" en true et "null" en null. Désactivé par défaut, car XML n’a pas de types et deviner transforme des références de pièces en entiers. |
| Zéros de tête | gardés comme string | toujours | 007 reste "007", même avec l’analyse des valeurs activée. La grammaire JSON interdit un zéro de tête, il n’existe donc aucune représentation cible qui le garde. |
| Supprimer les espaces de noms | booléen | désactivé | Retire les préfixes, si bien que soap:Envelope devient Envelope, et supprime les déclarations xmlns. Pratique pour SOAP ; avec perte si deux espaces de noms partagent le même nom local. |
| Conserver les commentaires | booléen | désactivé | Préserve les commentaires sous un membre #comment. Leur position entre les éléments n’est pas conservée, car les objets JSON n’ont pas d’ordre. |
| Éléments vides | null | toujours | <a/> et <a></a> sont la même chose en XML, et tous deux deviennent null plutôt qu’une chaîne vide, qui suggérerait une valeur. |
| CDATA | texte littéral | — | Le contenu d’une section CDATA est repris tel quel : un < à l’intérieur est une esperluette suivie de lt, pas un signe inférieur. C’est exactement le rôle de CDATA. |
| Entités | décodées | les cinq prédéfinies | & < > " ' plus les références numériques. Une entité non déclarée est laissée telle quelle plutôt que supprimée, car supprimer du contenu en silence est la pire des défaillances. |
Questions fréquentes
Pourquoi un élément seul donne-t-il un objet et deux éléments un tableau ?
Parce que XML n’a pas de tableaux, et c’est le plus grand danger de sa conversion. Un convertisseur voit un <line> et ne peut pas savoir si le schéma en autorise davantage. Mettez le nom de l’élément dans le champ de forçage en tableau et il devient un tableau à chaque fois — c’est contre cela que votre code doit être écrit. Cela vaut la peine d’être fait avant la mise en production, pas après qu’une commande à un article a cassé la production.
Pourquoi mes clés commencent-elles par @ ?
Ce sont des attributs. XML a deux sortes de membres et JSON une seule, donc les attributs ont besoin d’un préfixe sinon ils entrent en collision avec les éléments enfants — et un élément avec à la fois un attribut sku et un enfant sku n’a rien d’insolite. Vous pouvez régler le préfixe sur vide pour les fusionner, ou le changer pour quelque chose de plus convivial comme un tiret bas.
Pourquoi mes nombres sont-ils des chaînes ?
Parce qu’en XML, ce sont des chaînes. Le document ne contient aucune information de type, donc convertir <qty>3</qty> en nombre 3 est une supposition qui tombe juste pour les quantités et se trompe pour les références, les codes postaux et les numéros de téléphone. Activez l’analyse des valeurs si vos données ne contiennent aucun identifiant complété par des zéros ; même dans ce cas, un zéro initial garde la valeur en chaîne.
Qu’est devenu le texte autour de mes éléments enfants ?
Il a été joint et rattaché à la clé text, et sa position a été perdue. C’est du contenu mixte, et JSON ne peut réellement pas le représenter : un objet n’a pas d’ordre, donc il n’y a nulle part où enregistrer qu’un texte venait avant un enfant et un autre après. Si votre XML est en forme de document — XHTML, DocBook, tout ce qui contient du balisage dans la prose — le convertir en JSON est la mauvaise opération plutôt qu’une opération avec perte.
Gère-t-il les réponses SOAP ?
Oui, et activez strip namespaces, qui transforme soap:Envelope en Envelope et retire les déclarations xmlns qui apparaîtraient sinon comme attributs sur chaque élément. Sachez que ce retrait fait perdre de l’information si le document utilise réellement deux espaces de noms avec le même nom local — rare en SOAP, courant en XML à vocabulaires mixtes.
Mon XML est-il envoyé ?
Non. Le tokenizer et le convertisseur s’exécutent tous deux dans l’onglet déjà ouvert — vérifiez le panneau Network. C’est important parce que le XML qui circule aujourd’hui est surtout du SOAP, des assertions SAML et des messages financiers, autrement dit une des matières les plus sensibles qu’un développeur manipule.