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áticamenteCSV 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:
- Comprueba que parsea con el validador JSON —— ver Cómo validar JSON.
- Embellécelo para revisarlo —— ver Cómo formatear JSON.
- Si la conversión produjo JSON no del todo válido (comillas simples, comas finales), JSON Fix lo repara al instante.
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
- Cómo convertir JSON a CSV (y al revés) —— la dirección inversa, con conversor de un clic
- Conversor JSON a CSV —— convierte JSON ⇄ CSV en tu navegador
- Conversión XML a JSON —— atributos, nodos de texto, arrays y namespaces en profundidad
- JSON a XML —— la dirección inversa, con conversor JSON ⇄ XML
- Validador JSON —— confirma que tu JSON convertido es válido
- JSON Fix —— repara salida de conversor no del todo válida
- Cómo formatear JSON —— embellece el resultado
- ¿Qué es JSON? —— los tipos y reglas del formato destino