← Todos los artículos

Cómo convertir CSV y XML a JSON

Convierte CSV y XML a JSON en JavaScript, Python y el navegador. Cubre el mapeo array-de-objetos, el manejo de atributos XML y las trampas de coerción de tipos.

CSV y XML están por todas partes —— exports de hojas de cálculo, APIs antiguas, feeds de empresa —— pero la mayoría del código moderno quiere JSON. Convertir entre ellos es directo en cuanto entiendes las reglas de mapeo y las trampas (todo en CSV es string; los atributos XML y los elementos repetidos necesitan trato especial). Esta guía cubre ambas conversiones en JavaScript, Python y en el navegador.

Alcance: este artículo es el how-to amplio que cubre CSV → JSON y XML → JSON en el mismo sitio. Si necesitas específicamente XML —— atributos, nodos de texto, elementos repetidos y namespaces en profundidad —— lee Conversión XML a JSON: atributos, nodos de texto, arrays y namespaces. Para la dirección inversa, ver JSON a XML.

Convertir CSV a JSON

Un fichero CSV son filas de valores separados por comas, normalmente con una fila de cabecera. La representación JSON natural es un array de objetos, uno por fila, indexado por la cabecera:

# CSV
id,name,active
1,Ada,true
2,Bob,false
// JSON
[
  { "id": "1", "name": "Ada", "active": "true" },
  { "id": "2", "name": "Bob", "active": "false" }
]

Fíjate en que cada valor es una cadena —— CSV no tiene tipos. Convertir "1" a número o "true" a booleano es un paso de coerción separado que debes hacer a propósito.

CSV a JSON en JavaScript

Para CSV simple y de confianza puedes hacer split a mano —— pero el CSV real tiene campos entrecomillados con comas y saltos de línea, así que en producción usa un parser de verdad como papaparse:

// Parser mínimo —— solo seguro con CSV simple, sin comillas
function csvToJson(csv) {
  const [header, ...rows] = csv.trim().split('\n');
  const keys = header.split(',');
  return rows.map((row) => {
    const values = row.split(',');
    return Object.fromEntries(keys.map((k, i) => [k, values[i]]));
  });
}

// Producción —— gestiona comillas, comas internas y saltos de línea
import Papa from 'papaparse';
const result = Papa.parse(csvText, { header: true, dynamicTyping: true });
// dynamicTyping convierte "1" → 1 y "true" → true automáticamente

CSV a JSON en Python

import csv, json

with open('data.csv', newline='') as f:
    rows = list(csv.DictReader(f))   # lista de dicts indexados por cabecera

print(json.dumps(rows, indent=2))

Convertir XML a JSON

XML es más complicado porque tiene conceptos que JSON no: atributos, nodos de texto y elementos único-vs-repetido. No hay un mapeo «correcto» único, así que elige una convención y aplícala de forma consistente.

<!-- XML -->
<user id="1">
  <name>Ada</name>
  <role>admin</role>
  <role>editor</role>
</user>
// Un mapeo JSON habitual
{
  "user": {
    "@id": "1",                    // atributo, con prefijo @
    "name": "Ada",                 // hijo único → valor
    "role": ["admin", "editor"]    // hijo repetido → array
  }
}

XML a JSON en JavaScript

import { XMLParser } from 'fast-xml-parser';

const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@' });
const obj = parser.parse(xmlString);
// En el navegador también puedes usar DOMParser y recorrer el árbol de nodos a mano.

XML a JSON en Python

import xmltodict, json

doc = xmltodict.parse(xml_string)   # los atributos pasan a claves "@name"
print(json.dumps(doc, indent=2))

Trampas de mapeo a vigilar

  • Los tipos se pierden. Los valores de CSV y XML llegan como cadenas. Convierte números y booleanos explícitamente —— no asumas que el parser lo hizo.
  • Único vs. repetido. Un <role> se vuelve valor; dos se vuelven array. Decide si un campo debe ser siempre array para no sorprender a los consumidores.
  • Atributos vs. elementos hijos.Escoge una convención de prefijo (habitualmente @) y documéntala.
  • Valores vacíos y espacios. Los elementos XML vacíos y las comas finales del CSV pueden producir null, "" o claves ausentes según el parser.

Rarezas de BOM y codificación

Los ficheros exportados desde Excel y algunas herramientas Windows empiezan por un BOM UTF-8 (0xEF 0xBB 0xBF). Quítalo antes de parsear o tu primera cabecera / nombre de elemento lo incluirá en silencio. RFC 8259 prohíbe BOM al inicio del JSON, así que cualquier conversor que construyas debe eliminarlo de la entrada en vez de copiarlo a la salida.

TSV vs CSV (y otros delimitadores)

«CSV» no siempre va separado por comas. Los valores separados por tabulador (TSV) son habituales en pipelines de ingeniería porque las tabulaciones casi nunca aparecen dentro de los valores, así que te puedes ahorrar todo el lío de las comillas. Los exports del Excel europeo suelen usar ;. Si tu salida parece una columna rara, el fichero usa un delimitador distinto del que espera tu parser —— cambia el delimitador o usa una librería que lo detecte.

Namespaces XML

Los elementos XML pueden ir cualificados con un prefijo de namespace (p. ej. <soap:Envelope>) atado por una declaración xmlns. JSON no tiene concepto de namespace, así que la mayoría de conversores escogen uno de tres caminos: mantener el prefijo en la clave ("soap:Envelope"), quitarlo, o guardar las declaraciones xmlns como atributos @xmlns:*. Mantener el prefijo es la única opción sin pérdida. Para el detalle profundo, ver Conversión XML a JSON.

Valida y formatea el resultado

Tras convertir, confirma que la salida está bien formada y se lee:

Preguntas frecuentes

¿Cómo convierto CSV a JSON?

Parsea el CSV en filas y mapea cada una a un objeto indexado por la cabecera —— usa csv.DictReader en Python o una librería como papaparse en JavaScript. Recuerda que todos los valores empiezan como cadenas; convierte los tipos tú mismo.

¿Por qué todos los valores CSV-a-JSON son cadenas?

CSV no tiene tipos —— cada campo es texto. Activa la coerción de tipos (p. ej. dynamicTyping de papaparse) o convierte números y booleanos explícitamente tras parsear.

¿Cómo manejo los atributos XML al convertir a JSON?

La mayoría de conversores mapean los atributos a claves con un prefijo como @ (p. ej. @id). Elige una convención y aplícala consistentemente para que el código de aguas abajo sepa dónde mirar.

¿Por qué mi salida XML-a-JSON a veces da objeto y a veces array?

Un único elemento hijo mapea a un valor; un elemento repetido mapea a un array. Configura tu parser para tratar ciertos elementos siempre como arrays si los consumidores esperan una forma consistente.

Convierte, valida y formatea en tu navegador