Conversió XML a JSON
No sols cal entendre com convertir XML a JSON no és copiar estructures, sinó decidir com volem modelar les dades.
Partim d’un XML senzill amb dos productes.
<productos>
<producto>
<nombre>Camiseta</nombre>
<precio>19.99</precio>
<disponible>true</disponible>
<detalles>
<color>Rojo</color>
<talla>M</talla>
</detalles>
</producto>
<producto>
<nombre>Pantalón</nombre>
<precio>29.99</precio>
<disponible>false</disponible>
<detalles>
<color>Azul</color>
<talla>L</talla>
</detalles>
</producto>
</productos>
Este XML conté:
- Un element arrel:
productos - Diversos elements repetits:
producto - Dades simples: nom, preu, disponibilitat
- Un subelement compost:
detalles
Ara ens fem una pregunta important:
Hi ha una única forma correcta de passar açò a JSON?
La resposta és no.
Primera proposta: Array directe
Podem representar els productes com una llista directa.
[
{
"nombre": "Camiseta",
"precio": 19.99,
"disponible": true,
"detalles": {
"color": "Rojo",
"talla": "M"
}
},
{
"nombre": "Pantalón",
"precio": 29.99,
"disponible": false,
"detalles": {
"color": "Azul",
"talla": "L"
}
}
]
En este cas:
- El document JSON és directament un array.
- Cada element de l’array és un producte.
-
Els tipus de dades estan correctament representats:
precioés number.disponibleés boolean.
Esta estructura és:
- Simple.
- Fàcil d’iterar.
- Clara.
Però presenta una limitació:
- No hi ha cap clau que indique què conté l’array.
- No hi ha context explícit.
Segona proposta: Objecte amb clau “productos”
Podem encapsular l’array dins d’un objecte.
{
"productos": [
{
"nombre": "Camiseta",
"precio": 19.99,
"disponible": true,
"detalles": {
"color": "Rojo",
"talla": "M"
}
},
{
"nombre": "Pantalón",
"precio": 29.99,
"disponible": false,
"detalles": {
"color": "Azul",
"talla": "L"
}
}
]
}
Ara tenim:
- Un objecte principal.
- Una clau descriptiva:
productos. - Un array dins d’esta clau.
Esta estructura aporta:
- Context.
- Autodescripció.
- Possibilitat d’afegir més camps en el futur.
Per exemple, podríem afegir:
- Nombre total de productes.
- Data d’actualització.
- Informació del catàleg.
Comparativa Model 1 i 2
Les dues opcions són correctes.
La diferència principal és:
- Simplicitat en l’Opció 1.
- Context i escalabilitat en l’Opció 2.
Ací introduïm una idea fonamental:
JSON no és només una traducció d’XML. JSON és una decisió de modelatge.
Quin model triaríem?
Després d’analitzar el Model 1 i el Model 2, ens plantegem algunes preguntes.
1. Si este JSON formara part d’una API pública, quin model seria més adequat?
Mostra la resposta
En una API pública sol ser més adequat el Model 2. Incloure la clau `productos` aporta context i fa que el JSON siga més autodescriptiu. A més, permet afegir fàcilment metadades (per exemple, total de productes o informació del catàleg) sense modificar l’estructura principal. En entorns professionals, esta forma és més habitual.2. Si en el futur volem afegir informació global (per exemple, total de productes o data d’actualització), quin model escala millor?
Mostra la resposta
El Model 2 escala millor. En estar encapsulat dins d’un objecte, podem afegir nous camps al mateix nivell que `productos` sense afectar l’array. En canvi, en el Model 1, que és un array directe, no és possible afegir camps globals sense canviar tota l’estructura.3. Si només volem iterar ràpidament la llista en un bucle, quin model és més simple?
Mostra la resposta
El Model 1 és lleugerament més simple per a iterar, ja que el document és directament un array. No cal accedir a cap clau intermèdia abans de recórrer els elements. Tot i això, la diferència pràctica és mínima en entorns reals.4. Quin model és més autodescriptiu per a una persona que veu el JSON per primera vegada?
Mostra la resposta
El Model 2 és més autodescriptiu. La presència de la clau `productos` indica clarament què representa la informació continguda dins de l’array. El Model 1, en ser només un array, no indica explícitament el tipus de dades que conté.5. Podem dir que el Model 1 és incorrecte?
Mostra la resposta
No. El Model 1 és perfectament vàlid des del punt de vista de JSON. La diferència no és de correcció, sinó de modelatge. La decisió depén del context i de l’ús previst de les dades.Evolució de les estructures
Una vegada hem entés les dues formes més habituals, podem ampliar la visió.
Conversió fidel a l’XML
Podem mantindre exactament la jerarquia original.
{
"productos": {
"producto": [
{
"nombre": "Camiseta",
"precio": "19.99",
"disponible": "true",
"detalles": {
"color": "Rojo",
"talla": "M"
}
}
]
}
}
En esta representació:
- Es manté l’estructura XML.
- Es conserva cada etiqueta.
És útil quan es fa una transformació automàtica.
Però:
- Introduïx més nivells dels necessaris.
- Els valors poden quedar com a strings.
- Pot dificultar la manipulació posterior.
Estructura més plana
Podem eliminar el subobjecte detalles.
{
"productos": [
{
"nombre": "Camiseta",
"precio": 19.99,
"disponible": true,
"color": "Rojo",
"talla": "M"
}
]
}
Açò facilita l’accés als camps.
Però:
- Si els detalls creixen en el futur,
- pot resultar menys organitzat.
Claus úniques per producte
Podem usar el nom com a clau.
{
"productos": {
"Camiseta": {
"precio": 19.99,
"disponible": true,
"detalles": {
"color": "Rojo",
"talla": "M"
}
},
"Pantalón": {
"precio": 29.99,
"disponible": false,
"detalles": {
"color": "Azul",
"talla": "L"
}
}
}
}
Esta estructura permet:
- Accés directe sense iterar.
Però requereix:
- Que els noms siguen únics.
- Que no canvien.
En entorns professionals, normalment s’utilitzen identificadors únics (id) en lloc del nom.
Idea final
Quan convertim XML a JSON no estem fent només un canvi de format.
Estem decidint:
- Com volem accedir a les dades.
- Com volem escalar l’estructura.
- Quina informació és principal.
- Quin nivell de nesting és adequat.
La millor estructura no és la més fidel. La millor estructura és la més adequada al context d’ús.
En desenvolupament web real, l’opció més habitual sol ser:
Objecte amb clau descriptiva que conté un array. (Opcio 2)
Però la decisió sempre depén del problema que volem resoldre.