Conversió XML - JSON. Exemple
Partirem d’un fragment XML que conté la informació de dos productes, cadascun amb:
- nom, preu, disponibilitat i detalls (color i talla).
<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>
Podem transformar l’XML en estructures JSON de diferents formes:
Variant 1: Array Simple
JSON:
[
{
"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"
}
}
]
Estructura
- El document JSON és directament un array de productes, sense cap clau encapsuladora.
- És la forma més simple i plana de representar una llista d’elements.
- Avantatges:
- Simplicitat: Mínims nivells de nesting, fàcil d’entendre i iterar.
- Directe: Moltes API o serveis esperen rebre arrays directes.
- Inconvenients:
- Falta de context: No s’indica explícitament el tipus de dades (per exemple, “productos”), la qual cosa pot ser menys autodescriptiu en entorns complexos.
Variant 2: Objecte amb Clau “productos” Contenint un Array
JSON:
{
"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"
}
}
]
}
Estructura:
- Es defineix un objecte amb una clau principal, “productos”, que conté l’array de productes.
-
Aquesta forma afegeix un context clar sobre què conté l’array, fent la informació més autodescriptiva.
- Avantatges:
- Autodescripció: La clau “productos” facilita la comprensió del contingut.
- Organització: Es pot ampliar fàcilment amb altres camps si es requereix més informació (per exemple, metadades).
- Inconvenients:
- Nesting addicional: Introduir un nivell extra d’objectes pot resultar lleugerament més complex en termes d’accés als elements, tot i que aquest cost és mínim en la pràctica.
Comparació amb la Variant 1
- Context vs. Simplicitat: La Variant 2 ofereix més context (identificant clarament la llista com a “productos”) mentre que la Variant 1 és més simple però menys descriptiva.
Variant 3: Conversió Directa Respectant la Jerarquia XML
JSON:
{
"productos": {
"producto": [
{
"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"
}
}
]
}
}
Estructura:
- Es manté la jerarquia exacta de l’XML original: un objecte “productos” que conté un altre objecte “producto”, que al seu torn és un array.
- És útil quan es vol conservar la correspondència exacta amb l’XML, potser per processos de transformació bidireccionals.
- Avantatges:
- Traçabilitat: Cada etiqueta XML es conserva, facilitant la traça des del format original.
- Inconvenients:
- Nesting innecessari: El doble nivell pot fer més complex l’accés als elements.
- Tipus de dades: Tots els valors es representen com a cadenes (strings), per tant es perd la conversió natural a nombres o booleans, cosa que pot complicar operacions posteriors.
Comparació amb les Variants 1 i 2
- Fidelitat vs. Pràctica: Aquesta variant és molt fidel a l’XML però pot resultar menys pràctica per a manipulació de dades, en comparació amb les variants 1 i 2 que ofereixen estructures més plans i tipades.
Variant 4: Estructura amb Detalls Integrats (Flat Structure)
JSON:
{
"productos": [
{
"nombre": "Camiseta",
"precio": 19.99,
"disponible": true,
"color": "Rojo",
"talla": "M"
},
{
"nombre": "Pantalón",
"precio": 29.99,
"disponible": true,
"color": "Azul",
"talla": "L"
}
]
}
Estructura:
- Es retira l’objecte “detalles” i els seus camps (color i talla) es mouen al mateix nivell que la resta d’atributs del producte.
- Quan els detalls són molt simples i sempre tenen la mateixa estructura, pot ser més còmode accedir directament als seus valors sense haver d’entrar en un subobjecte.
- Avantatges:
- Accés directe: Menys nesting facilita la lectura i l’accés als camps.
- Simplicitat: L’estructura és molt plana, cosa que pot fer el JSON més fàcil de gestionar en aplicacions senzilles.
- Inconvenients:
- Pèrdua de modularitat: Si en el futur els “detalles” s’expandeixen amb més camps, pot ser necessari tornar a agrupar-los per mantenir l’organització.
- Menor claredat semàntica: La separació dels detalls del producte es dilueix, la qual pot afectar la comprensió en estructures més complexes.
Comparació amb les Variants 1 i 2
- Planalitat vs. Agrupació: Aquesta variant és més plana que la Variant 2, però sacrifica una part de l’organització semàntica que pot ser útil en entorns amb dades més complexes.
Variant 5: Productes Identificats per Nom (Claus Úniques)
JSON:
{
"productos": {
"Camiseta": {
"precio": 19.99,
"disponible": true,
"detalles": {
"color": "Rojo",
"talla": "M"
}
},
"Pantalón": {
"precio": 29.99,
"disponible": false,
"detalles": {
"color": "Azul",
"talla": "L"
}
}
}
}
Estructura:
- Es crea un objecte “productos” on cada clau és el nom del producte i el valor és un objecte amb la resta d’informació.
- Aquesta variant és útil quan els noms dels productes són únics i es vol accedir ràpidament a un producte concret sense iterar per un array.
- Avantatges:
- Accés directe: Permet recuperar fàcilment un producte donat el seu nom.
- Eliminació d’iteració: No cal recorrer un array per trobar l’element desitjat.
- Inconvenients:
- Requisit d’unicitat: Si els noms no són únics, aquesta estructura pot generar problemes.
- Flexibilitat limitada: Menys adient per a situacions on es pot tenir més d’un element amb la mateixa identificació o quan es necessita iterar la col·lecció completa.
Comparació amb les Altres Variants
- Orientada a la clau vs. Llista: Aquesta variant és molt útil per a accessos directes, però és menys flexible en operacions d’iteració i en entorns on la unicitat del nom no està garantida.
Comparativa Global i Conclusió
Variant | Estructura | Avantatges Principals | Inconvenients Principals |
---|---|---|---|
1. Array Simple | Directe array d’objectes | Senzillesa, iteració directa | Manca de context/descripció |
2. Objecte amb clau “productos” | Objecte → “productos” → array | Autodescripció, organització | Nivell extra de nesting (menor impacte) |
3. Conversió Directa (jerarquia XML) | “productos” → “producto” → array | Fidelitat a l’XML original | Nesting innecessari, tipus no convertits |
4. Detalls Integrats (flat) | “productos” → array (amb atributs fusionats) | Accés directe als atributs | Pèrdua de modularitat, menys semàctic |
5. Claus Úniques (per nom) | “productos” → objecte amb claus per producte | Accés ràpid per nom | Requereix noms únics, menys flexible en iteració |
Quina és la millor opció?
En la majoria dels escenaris pràctics, la Variant 2 (Objecte amb clau “productos” que conté un array) sol ser la més utilitzada perquè:
- Autodescripció: Ofereix clarament el context de la llista de productes.
- Equilibri: Combina una estructura organitzada amb la facilitat d’iteració i manipulació dels elements.
- Escalabilitat: És fàcil d’ampliar si es volen afegir altres camps o metadades sense comprometre l’accessibilitat dels productes.
Però, l’elecció pot variar segons el context:
- Per a intercanvis senzills i quan no es necessita metainformació, la Variant 1 (Array Simple) pot ser suficient.
- Si es vol mantenir una correspondència exacta amb l’XML, la Variant 3 pot ser útil, tot i els seus inconvenients.
- Quan la clau d’accés és rellevant i els noms són únics, la Variant 5 és una opció viable.