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.