Trabajar con JSON y XML en Python
JSON y XML son los formatos de datos más usados para intercambio de información en APIs, configuraciones y archivos de datos. Python incluye soporte nativo para ambos.
JSON con el módulo json
Leer y Escribir JSON
import json
from pathlib import Path
# Leer JSON desde archivo
with open("datos.json", encoding='utf-8') as f:
datos = json.load(f)
print(datos)
print(type(datos)) # dict o list
# Escribir JSON a archivo
datos["actualizado"] = "2024-06-15"
with open("datos_nuevo.json", "w", encoding='utf-8') as f:
json.dump(datos, f, indent=2, ensure_ascii=False)
# Desde/hacia string
texto_json = json.dumps({"nombre": "Ana", "edad": 30}, indent=2)
obj = json.loads(texto_json)
print(obj["nombre"])
Filtrar y Transformar JSON
import json
with open("usuarios.json", encoding='utf-8') as f:
usuarios = json.load(f)
# Filtrar activos mayores de 18
activos = [u for u in usuarios if u.get("activo") and u.get("edad", 0) >= 18]
# Transformar estructura
resumen = [{"id": u["id"], "nombre": u["nombre"]} for u in activos]
with open("resumen.json", "w", encoding='utf-8') as f:
json.dump(resumen, f, indent=2, ensure_ascii=False)
print(f"Filtrados: {len(resumen)} de {len(usuarios)}")
JSON Lines (JSONL) — Un objeto por línea
import json
# Escribir JSONL
registros = [
{"id": 1, "nombre": "Ana", "ciudad": "Madrid"},
{"id": 2, "nombre": "Luis", "ciudad": "Barcelona"},
{"id": 3, "nombre": "Eva", "ciudad": "Sevilla"},
]
with open("datos.jsonl", "w", encoding='utf-8') as f:
for r in registros:
f.write(json.dumps(r, ensure_ascii=False) + "\n")
# Leer JSONL
with open("datos.jsonl", encoding='utf-8') as f:
leidos = [json.loads(linea) for linea in f if linea.strip()]
print(f"Registros: {len(leidos)}")
XML con xml.etree.ElementTree
Leer XML
import xml.etree.ElementTree as ET
tree = ET.parse("catalogo.xml")
root = tree.getroot()
print(f"Raíz: {root.tag}")
for hijo in root:
print(f" {hijo.tag}: {hijo.text} atributos={hijo.attrib}")
# Buscar elementos con XPath básico
for producto in root.findall(".//producto"):
nombre = producto.find("nombre").text
precio = producto.find("precio").text
print(f" {nombre}: {precio}")
Crear y Escribir XML
import xml.etree.ElementTree as ET
from xml.dom import minidom
def crear_xml_catalogo(productos, salida):
root = ET.Element("catalogo")
root.set("version", "1.0")
for p in productos:
elem = ET.SubElement(root, "producto")
elem.set("id", str(p["id"]))
ET.SubElement(elem, "nombre").text = p["nombre"]
ET.SubElement(elem, "precio").text = str(p["precio"])
ET.SubElement(elem, "stock").text = str(p["stock"])
# Formato bonito
xml_str = minidom.parseString(ET.tostring(root, encoding='unicode')).toprettyxml(indent=" ")
with open(salida, "w", encoding="utf-8") as f:
f.write(xml_str)
print(f"XML creado: {salida}")
crear_xml_catalogo([
{"id": 1, "nombre": "Widget A", "precio": 9.99, "stock": 150},
{"id": 2, "nombre": "Widget B", "precio": 24.99, "stock": 80},
], "catalogo.xml")
xmltodict — XML como Diccionario Python
pip install xmltodict
import xmltodict
import json
# XML a dict
with open("catalogo.xml", encoding='utf-8') as f:
datos = xmltodict.parse(f.read())
# Ahora es un diccionario Python normal
print(datos["catalogo"]["producto"])
# XML a JSON
with open("catalogo.json", "w", encoding='utf-8') as f:
json.dump(datos, f, indent=2, ensure_ascii=False)
# dict a XML
xml_str = xmltodict.unparse(datos, pretty=True)
with open("nuevo.xml", "w", encoding='utf-8') as f:
f.write(xml_str)
Convertir JSON a XML
import json, xmltodict
def json_a_xml(json_path, xml_path, raiz="datos"):
with open(json_path, encoding='utf-8') as f:
datos = json.load(f)
envuelto = {raiz: datos}
xml_str = xmltodict.unparse(envuelto, pretty=True)
with open(xml_path, "w", encoding='utf-8') as f:
f.write(xml_str)
print(f"Convertido: {json_path} -> {xml_path}")
json_a_xml("datos.json", "datos.xml")
Recurso Adicional
Para convertir archivos JSON, XML y CSV entre sí sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones de documento que siguen este tema: