32- JSON en Python




Python JSON

🐍 Python y JSON: El Módulo json

Python proporciona un módulo built-in llamado json que facilita trabajar con datos en formato JSON. Este módulo permite realizar dos operaciones principales:

  • Serialización (Encoding): Convertir objetos de Python a cadenas JSON.
  • Deserialización (Decoding): Convertir cadenas JSON a objetos de Python.

Importando el Módulo json:

Para comenzar a trabajar con JSON en Python, primero necesitas importar el módulo json:

      
import json
      
     

¿Por Qué JSON?

JSON se ha convertido en un estándar para el intercambio de datos en la web debido a sus siguientes características:

  • Ligero: Tiene una sintaxis mínima, lo que resulta en archivos y transmisiones de datos más pequeños.
  • Legible por Humanos: Su estructura basada en texto es fácil de entender.
  • Fácil de Parsear por Máquinas: Los lenguajes de programación tienen bibliotecas para analizar y generar JSON fácilmente.
  • Independiente del Lenguaje: JSON es un formato independiente del lenguaje, lo que permite la comunicación entre sistemas escritos en diferentes lenguajes.

Estructura Básica de JSON:

Los datos en JSON se representan principalmente mediante dos estructuras:

  • Objetos: Colecciones de pares clave-valor. Las claves deben ser cadenas y los valores pueden ser de los siguientes tipos: cadena, número, booleano, otro objeto, array o null. En Python, esto se mapea a un diccionario. Los objetos JSON están encerrados entre llaves {}.
  • Arrays: Listas ordenadas de valores. Los valores pueden ser de los mismos tipos que los valores en un objeto. En Python, esto se mapea a una lista. Los arrays JSON están encerrados entre corchetes [].

Ejemplo de Estructura JSON:

      
{
 "nombre": "Ana",
 "edad": 30,
 "ciudad": "Madrid",
 "hobbies": ["leer", "viajar", "programar"],
 "direccion": {
  "calle": "Gran Vía, 1",
  "codigo_postal": "28001"
 },
 "es_estudiante": false,
 "cursos": null
}
      
     

En este ejemplo, vemos un objeto JSON que contiene diferentes tipos de valores, incluyendo cadenas, números, un array, otro objeto, un booleano y un valor null.

En los siguientes temas, aprenderemos cómo convertir datos JSON a objetos de Python y viceversa utilizando el módulo json.

JSON in Python

🐍 JSON en Python: Representación de Datos

Cuando trabajas con JSON en Python, es importante entender cómo los tipos de datos de JSON se mapean a los tipos de datos de Python. El módulo json realiza estas conversiones automáticamente durante la serialización y deserialización.

Mapeo de Tipos de Datos JSON a Python:

Cuando deserializas (conviertes de JSON a Python), los tipos de datos JSON se convierten a los siguientes tipos de Python:

JSON Python
object dict (diccionario)
array list (lista)
string str (cadena)
number (integer) int (entero)
number (float) float (flotante)
true True (booleano)
false False (booleano)
null None (NoneType)

Mapeo de Tipos de Datos Python a JSON:

Cuando serializas (conviertes de Python a JSON), los tipos de datos de Python se convierten a los siguientes tipos de JSON:

Python JSON
dict object
list, tuple array
str string
int, float number
True true
False false
None null

Trabajando con el Módulo json:

El módulo json proporciona principalmente dos pares de funciones para realizar la serialización y deserialización:

  • json.loads(): Deserializa una cadena JSON a un objeto de Python.
  • json.load(): Deserializa un archivo o un objeto similar a un archivo que contiene datos JSON a un objeto de Python.
  • json.dumps(): Serializa un objeto de Python a una cadena JSON.
  • json.dump(): Serializa un objeto de Python a un archivo o un objeto similar a un archivo en formato JSON.

En los siguientes temas, veremos ejemplos prácticos de cómo usar estas funciones para analizar (parsear) JSON y convertir desde Python a JSON.

Parse JSON - Convert from JSON to Python

⚙️ Parsear JSON: De JSON a Objetos Python

Usando json.loads(): Analizar una Cadena JSON

La función json.loads() se utiliza para analizar una cadena que contiene datos en formato JSON y convertirla a un objeto de Python (generalmente un diccionario o una lista).

      
import json

cadena_json = '{ "nombre":"Carlos", "edad":35, "ciudad":"Barcelona"}'

# Analizar la cadena JSON
objeto_python = json.loads(cadena_json)

# El resultado es un diccionario de Python
print(objeto_python)
print(type(objeto_python))

# Acceder a los valores del diccionario
print(objeto_python["nombre"])
print(objeto_python["edad"])
print(objeto_python["ciudad"])
      
     

Al ejecutar este código, la variable objeto_python contendrá un diccionario de Python con las claves y valores correspondientes a la cadena JSON.

Usando json.load(): Analizar un Archivo JSON

La función json.load() se utiliza para leer datos desde un archivo (o un objeto similar a un archivo) que contiene formato JSON y convertirlo a un objeto de Python.

Primero, necesitarías tener un archivo con contenido JSON (por ejemplo, datos.json):

Contenido de datos.json:
      
{
 "empleados": [
  {"nombre": "Elena", "departamento": "Ventas"},
  {"nombre": "Javier", "departamento": "Marketing"}
 ]
}
      
     

Ahora, el código Python para leer y analizar este archivo sería:

      
import json

# Abrir el archivo JSON en modo lectura ('r')
with open('datos.json', 'r') as archivo:
    # Cargar los datos JSON desde el archivo
    datos_python = json.load(archivo)

# El resultado es un diccionario de Python
print(datos_python)
print(type(datos_python))

# Acceder a los datos
empleados = datos_python["empleados"]
for empleado in empleados:
    print(f"Nombre: {empleado['nombre']}, Departamento: {empleado['departamento']}")
      
     

Es importante utilizar la sentencia with open(...) para asegurarse de que el archivo se cierre correctamente después de su uso.

Con estas funciones, puedes fácilmente convertir datos JSON que provienen de APIs, archivos de configuración o cualquier otra fuente a estructuras de datos nativas de Python con las que puedes trabajar de manera eficiente.

En el siguiente tema, veremos cómo realizar la operación inversa: convertir objetos de Python a formato JSON.

Convert from Python to JSON

➡️ Convertir de Python a JSON

Usando json.dumps(): Convertir un Objeto Python a una Cadena JSON

La función json.dumps() se utiliza para convertir un objeto de Python (como un diccionario o una lista) en una cadena que representa ese objeto en formato JSON.

      
import json

# Un diccionario de Python
diccionario_python = {
    "nombre": "Elena",
    "edad": 28,
    "ciudad": "Sevilla",
    "hobbies": ["pintar", "bailar"],
    "tiene_mascotas": True,
    "cursos_completados": None
}

# Convertir el diccionario a una cadena JSON
cadena_json = json.dumps(diccionario_python)

# El resultado es una cadena JSON
print(cadena_json)
print(type(cadena_json))

# También podemos convertir una lista de Python a una cadena JSON
lista_python = [1, 2, "tres", True, None]
cadena_json_lista = json.dumps(lista_python)
print(cadena_json_lista)
print(type(cadena_json_lista))
      
     

Al ejecutar este código, cadena_json contendrá una representación en formato JSON del diccionario de Python, y cadena_json_lista contendrá la representación JSON de la lista.

Usando json.dump(): Convertir un Objeto Python a un Archivo JSON

La función json.dump() se utiliza para escribir un objeto de Python a un archivo (o un objeto similar a un archivo) en formato JSON.

      
import json

# Un diccionario de Python
datos_a_guardar = {
    "usuarios": [
        {"id": 1, "nombre": "Sofía"},
        {"id": 2, "nombre": "Mateo"}
    ]
}

# Abrir un archivo en modo escritura ('w')
with open('usuarios.json', 'w') as archivo:
    # Escribir el diccionario al archivo en formato JSON
    json.dump(datos_a_guardar, archivo)

print("Los datos han sido guardados en usuarios.json")
      
     

Este código creará un archivo llamado usuarios.json (si no existe) y escribirá el contenido del diccionario datos_a_guardar en formato JSON dentro de ese archivo.

Al igual que con json.load(), es importante utilizar with open(...) para asegurar el manejo adecuado del archivo.

Con estas funciones, puedes fácilmente convertir tus estructuras de datos de Python a formato JSON para guardarlas en archivos, enviarlas a través de la red, o cualquier otra necesidad de intercambio de datos.

En los siguientes temas, exploraremos cómo formatear la salida JSON para hacerla más legible y cómo ordenar los resultados.

Format the Result

✨ Formateando el Resultado JSON

El Parámetro indent: Indentación para Legibilidad

El parámetro indent en las funciones json.dumps() y json.dump() se utiliza para especificar el número de espacios a utilizar para la indentación. Esto hace que la estructura del JSON sea mucho más fácil de leer por humanos.

      
import json

datos = {
    "nombre": "Ricardo",
    "edad": 40,
    "direccion": {
        "calle": "Avenida Principal, 50",
        "ciudad": "Valencia"
    },
    "hobbies": ["correr", "cocinar"],
    "es_activo": True
}

# Sin indentación (formato compacto)
json_sin_indentar = json.dumps(datos)
print("JSON sin indentar:")
print(json_sin_indentar)
print("-" * 30)

# Con indentación de 4 espacios
json_indentado = json.dumps(datos, indent=4)
print("JSON con indentación de 4 espacios:")
print(json_indentado)

# También se puede usar un carácter diferente para la indentación, como un tabulador
json_indentado_tab = json.dumps(datos, indent='\t')
print("-" * 30)
print("JSON con indentación de tabulador:")
print(json_indentado_tab)

# Al escribir a un archivo, también se usa el parámetro indent
with open('datos_formateados.json', 'w') as archivo:
    json.dump(datos, archivo, indent=2)
print("-" * 30)
print("Datos guardados en datos_formateados.json con indentación de 2 espacios.")
      
     

Como puedes ver, la salida con indentación es mucho más fácil de leer y entender, especialmente cuando los datos JSON tienen varios niveles de anidación.

Otros Parámetros de Formato:

  • separators: Permite especificar los separadores utilizados en el JSON. Por defecto son (', ', ': '). Puedes modificarlos para obtener un formato más compacto (por ejemplo, (',', ':')).
  • sort_keys: Si se establece en True, los ключи de los diccionarios se ordenarán alfabéticamente en la salida JSON. Veremos esto en el siguiente tema.

Ejemplo con separators:

      
import json

datos = {"manzana": 1, "banana": 2, "cereza": 3}

# Formato por defecto
json_default_separators = json.dumps(datos)
print(f"Por defecto: {json_default_separators}")

# Formato más compacto
json_compact_separators = json.dumps(datos, separators=(',', ':'))
print(f"Compacto: {json_compact_separators}")
      
     

El parámetro separators puede ser útil si necesitas minimizar el tamaño del archivo JSON.

Formatear la salida JSON es crucial para la legibilidad y el mantenimiento de tus archivos y datos. El parámetro indent es el más comúnmente utilizado para este propósito.

En el siguiente tema, aprenderemos cómo ordenar los resultados JSON por clave.

Order the Result

🗝️ Ordenando el Resultado JSON

El Parámetro sort_keys: Orden Alfabético de las Claves

El parámetro sort_keys en las funciones json.dumps() y json.dump() se utiliza para especificar si las claves de los diccionarios deben ordenarse alfabéticamente en la salida JSON. Por defecto, su valor es False.

      
import json

datos_desordenados = {
    "z": 10,
    "a": 20,
    "m": 30,
    "b": 40
}

# Sin ordenar las claves (orden original del diccionario, que puede variar en Python < 3.7)
json_sin_ordenar = json.dumps(datos_desordenados)
print("JSON sin ordenar:")
print(json_sin_ordenar)
print("-" * 30)

# Ordenando las claves alfabéticamente
json_ordenado = json.dumps(datos_desordenados, sort_keys=True)
print("JSON con claves ordenadas:")
print(json_ordenado)

# También se puede combinar con la indentación
json_ordenado_indentado = json.dumps(datos_desordenados, sort_keys=True, indent=4)
print("-" * 30)
print("JSON con claves ordenadas e indentación:")
print(json_ordenado_indentado)

# Al escribir a un archivo, también se usa el parámetro sort_keys
with open('datos_ordenados.json', 'w') as archivo:
    json.dump(datos_desordenados, archivo, sort_keys=True, indent=2)
print("-" * 30)
print("Datos guardados en datos_ordenados.json con claves ordenadas e indentación.")
      
     

Como puedes ver, al establecer sort_keys=True, las claves del diccionario en la salida JSON se ordenan alfabéticamente. Esto puede ser útil para facilitar la comparación de archivos JSON o para mejorar la legibilidad en ciertos casos.

Consideraciones sobre el Orden:

  • En Python 3.7 y posteriores, los diccionarios recuerdan el orden de inserción de los elementos. Sin embargo, al serializar a JSON, este orden no está garantizado a menos que se utilicen extensiones específicas o se ordene explícitamente.
  • El parámetro sort_keys=True asegura un orden consistente basado en las claves, independientemente de la versión de Python o del orden de inserción original.

Ordenar las claves puede ser una práctica útil para la consistencia y la legibilidad en tus archivos y datos JSON.

Con esto, hemos cubierto los aspectos fundamentales para trabajar con JSON en Python. ¿Tienes alguna pregunta sobre el ordenamiento o sobre algún otro tema de JSON que hayamos visto?




Publicar un comentario

0 Comentarios