← Tutti gli articoli

JSON a XML: elementi root, array e mappatura degli attributi

Converti JSON in XML: scegliere un elemento root, mappare chiavi con prefisso @ ad attributi, trasformare array in elementi ripetuti e fare escape — in JS, Python e online.

Convertire JSON in XML è l'operazione inversa di un mapping con perdita, il che significa che dovrai prendere decisioni che JSON non ti aveva mai chiesto: qual è l'elemento radice? Questa chiave diventa attributo o elemento figlio? Come si trasforma un array JSON in tag XML ripetuti? Questa guida copre le convenzioni per JSON → XML —— elementi radice, array, attributi ed escape —— in JavaScript, Python e nel browser.

Scegliere un elemento radice

XML richiede esattamente un elemento radice; JSON non ha questa regola. La prima decisione è cosa avvolge tutto il resto. Se il tuo JSON è un oggetto con una sola chiave di primo livello, quella chiave è la radice naturale:

{ "note": { "to": "Ada", "from": "Bob" } }

<note>
  <to>Ada</to>
  <from>Bob</from>
</note>

Se il JSON ha più chiavi di primo livello (o è un array), non c'è una radice unica, quindi i convertitori avvolgono tutto con un elemento sintetico come <root>:

{ "to": "Ada", "from": "Bob" }

<root>
  <to>Ada</to>
  <from>Bob</from>
</root>

Attributi da chiavi con prefisso @

Per fare il round-trip con la convenzione XML → JSON, le chiavi che iniziano con @ vengono emesse come attributi invece che come elementi figli, e la chiave #text diventa il contenuto testuale dell'elemento:

{
  "price": { "@currency": "USD", "#text": "9.99" }
}

<price currency="USD">9.99</price>

Se non usi questa convenzione, ogni valore diventa un elemento figlio —— valido, solo più verboso. La convenzione @/#text è ciò che rende XML → JSON → XML senza perdita.

Gli array diventano elementi ripetuti

Un array JSON non diventa un singolo elemento con più valori —— diventa lo stesso elemento ripetuto, perché è così che XML rappresenta una lista:

{ "tags": { "tag": ["a", "b", "c"] } }

<tags>
  <tag>a</tag>
  <tag>b</tag>
  <tag>c</tag>
</tags>

Una conseguenza sottile: un array di oggetti di primo livello non può essere la radice (produrrebbe più elementi radice), quindi va avvolto —— di solito come <root> che contiene <item> ripetuti.

Valori senza mapping pulito

  • Booleani e numeri —— XML non ha tipi, quindi true e 42 vengono scritti come il testo true e 42.
  • null —— di solito un elemento vuoto/autochiudente: <middleName/>.
  • Chiavi che non sono nomi di elemento validi —— i nomi non possono iniziare con una cifra né contenere spazi. "1st place" non è un tag legale e va sanitizzato, altrimenti produrrai XML non valido.

Escape e dichiarazione

I valori di testo e attributo devono fare escape di &, < e > (più " dentro gli attributi). Un convertitore dovrebbe anche anteporre la dichiarazione XML perché l'output sia un documento completo:

<?xml version="1.0" encoding="UTF-8"?>
<message>B &amp; C are &lt; D</message>

Puntare a un XSD o produrre xmlns

Se il tuo consumer valida l'XML contro un XSD (XML Schema), la conversione deve fare qualcosa in più oltre al mapping chiave→elemento:

  • L'ordine degli elementi conta. Gli attributi XML di un elemento sono non ordinati (per spec), ma gli elementi figli sì, e la maggior parte degli XSD lo impone con xsd:sequence. Emetti i figli nell'ordine che lo schema si aspetta, non nell'ordine di iterazione delle chiavi dell'oggetto, altrimenti la validazione fallirà.
  • Mapping dei namespace. Ricrea le dichiarazioni xmlns come attributi @xmlns sulla radice e rifletti i nomi con prefisso nell'XML ("soap:Envelope"<soap:Envelope>). Un convertitore che scarta i namespace produrrà XML che non valida contro nessun XSD che li richieda.
  • Valori consapevoli del tipo. XML non ha tipi nativi, quindi un XSD con xsd:int o xsd:date si limita a verificare che il contenuto testuale corrisponda. Formatta il valore JSON come testo nello schema atteso dall'XSD (data ISO, intero come stringa ecc.).

Come convertire JSON in XML nel codice

// JavaScript —— un piccolo builder ricorsivo, o una libreria:
import { XMLBuilder } from 'fast-xml-parser';
const builder = new XMLBuilder({ ignoreAttributes: false, attributeNamePrefix: '@' });
const xml = builder.build(jsonObject);

# Python —— dicttoxml, o costruisci con xml.etree.ElementTree
from dicttoxml import dicttoxml
xml_bytes = dicttoxml({"note": {"to": "Ada"}}, attr_type=False)

Converti JSON in XML online

Incolla il tuo JSON nel convertitore JSON ⇄ XML e clicca To XML. Sceglie una radice sensata, mappa le chiavi @ su attributi, ripete elementi per gli array e fa l'escape dei caratteri speciali —— tutto nel browser. Se il JSON ha errori di sintassi, viene riparato prima; puoi anche pulirlo con JSON Fix.

Domande frequenti

Come converto JSON in XML?

Scegli un elemento radice (una singola chiave di primo livello, o un <root> sintetico) e converti ricorsivamente le chiavi in elementi figli, le chiavi con prefisso @ in attributi e gli array in elementi ripetuti —— facendo l'escape di &, < e > nel testo.

Come si converte un array JSON in XML?

Ogni elemento dell'array diventa un elemento separato con lo stesso nome di tag, perché XML rappresenta le liste come elementi ripetuti invece di un singolo nodo multivalore.

Come faccio diventare un valore JSON un attributo XML?

Prefissa la chiave con @ (es. "@id") e metti il testo dell'elemento sotto #text. Questo combacia con la convenzione standard XML → JSON, quindi la conversione è reversibile.

Cosa succede se una chiave JSON non è un nome di elemento XML valido?

I nomi di tag XML non possono iniziare con una cifra né contenere spazi, quindi chiavi come "1st place" vanno sanitizzate (es. in _1st_place), altrimenti l'output non sarà XML ben formato.

Strumenti e guide correlate