Búsqueda de sitios web

Convertir Python Dict a JSON: un tutorial para principiantes


Aprenda cómo convertir un diccionario de Python a JSON con este rápido tutorial.

Al crear aplicaciones en Python, JSON es uno de los formatos de datos comunes con los que trabajará. Y si alguna vez ha trabajado con API, probablemente ya esté familiarizado con el análisis de respuestas JSON de las API.

Como sabe, JSON es un formato basado en texto para el intercambio de datos, que almacena datos en pares clave-valor y es legible por humanos. Y los diccionarios de Python almacenan datos en pares clave-valor. Lo que hace que sea intuitivo cargar cadenas JSON en diccionarios para su procesamiento y también volcar datos de diccionarios en cadenas JSON.

En este tutorial, aprenderemos cómo convertir un diccionario de Python a JSON usando el módulo json incorporado. ¡Así que comencemos a codificar!

Convertir un diccionario de Python en una cadena JSON

Para convertir un diccionario de Python a una cadena JSON, puede usar la función dumps() del módulo json. La función dumps() toma un objeto Python y devuelve la representación de cadena JSON. En la práctica, sin embargo, necesitarás convertir no un solo diccionario sino una colección, como por ejemplo una lista de diccionarios.

Así que elijamos un ejemplo así. Digamos que tenemos libros, una lista de diccionarios, donde cada diccionario contiene información sobre un libro. Entonces, cada registro de libro está en un diccionario de Python con las siguientes claves: título, autor, año_publicación y género.

Al llamar a json.dumps(), configuramos el parámetro opcional indent: la sangría en la cadena JSON, ya que ayuda a mejorar la legibilidad (sí, ¿estamos bastante imprimiendo json? ):

import json

books = [
	{
    	"title": "The Great Gatsby",
    	"author": "F. Scott Fitzgerald",
    	"publication_year": 1925,
    	"genre": "Fiction"
	},
	{
    	"title": "To Kill a Mockingbird",
    	"author": "Harper Lee",
    	"publication_year": 1960,
    	"genre": "Fiction"
	},
	{
    	"title": "1984",
    	"author": "George Orwell",
    	"publication_year": 1949,
    	"genre": "Fiction"
	}
]

# Convert dictionary to JSON string
json_string = json.dumps(books, indent=4)
print(json_string)

Cuando ejecuta el código anterior, debería obtener un resultado similar:

Output >>>
[
	{
    	"title": "The Great Gatsby",
    	"author": "F. Scott Fitzgerald",
    	"publication_year": 1925,
    	"genre": "Fiction"
	},
	{
    	"title": "To Kill a Mockingbird",
    	"author": "Harper Lee",
    	"publication_year": 1960,
    	"genre": "Fiction"
	},
	{
    	"title": "1984",
    	"author": "George Orwell",
    	"publication_year": 1949,
    	"genre": "Fiction"
	}
]

Conversión de un diccionario Python anidado en una cadena JSON

A continuación, tomemos una lista de diccionarios Python anidados y obtengamos su representación JSON. Ampliemos el diccionario libros agregando una clave "reseñas". Cuyo valor es una lista de diccionarios y cada diccionario contiene información sobre una reseña, a saber, “usuario”, “calificación” y “comentario”.

Entonces modificamos el diccionario libros así:

import json

books = [
	{
    	"title": "The Great Gatsby",
    	"author": "F. Scott Fitzgerald",
    	"publication_year": 1925,
    	"genre": "Fiction",
    	"reviews": [
        	{"user": "Alice", "rating": 4, "comment": "Captivating story"},
        	{"user": "Bob", "rating": 5, "comment": "Enjoyed it!"}
    	]
	},
	{
    	"title": "To Kill a Mockingbird",
    	"author": "Harper Lee",
    	"publication_year": 1960,
    	"genre": "Fiction",
    	"reviews": [
        	{"user": "Charlie", "rating": 5, "comment": "A great read!"},
        	{"user": "David", "rating": 4, "comment": "Engaging narrative"}
    	]
	},
	{
    	"title": "1984",
    	"author": "George Orwell",
    	"publication_year": 1949,
    	"genre": "Fiction",
    	"reviews": [
        	{"user": "Emma", "rating": 5, "comment": "Orwell pulls it off well!"},
        	{"user": "Frank", "rating": 4, "comment": "Dystopian masterpiece"}
    	]
	}
]

# Convert dictionary to JSON string
json_string = json.dumps(books, indent=4)
print(json_string)

Tenga en cuenta que usamos el mismo valor de sangría de 4 y al ejecutar el script se obtiene el siguiente resultado:

Output >>>

[
	{
    	"title": "The Great Gatsby",
    	"author": "F. Scott Fitzgerald",
    	"publication_year": 1925,
    	"genre": "Fiction",
    	"reviews": [
        	{
            	"user": "Alice",
            	"rating": 4,
            	"comment": "Captivating story"
        	},
        	{
            	"user": "Bob",
            	"rating": 5,
            	"comment": "Enjoyed it!"
        	}
    	]
	},
	{
    	"title": "To Kill a Mockingbird",
    	"author": "Harper Lee",
    	"publication_year": 1960,
    	"genre": "Fiction",
    	"reviews": [
        	{
            	"user": "Charlie",
            	"rating": 5,
            	"comment": "A great read!"
        	},
        	{
            	"user": "David",
            	"rating": 4,
            	"comment": "Engaging narrative"
        	}
    	]
	},
	{
    	"title": "1984",
    	"author": "George Orwell",
    	"publication_year": 1949,
    	"genre": "Fiction",
    	"reviews": [
        	{
            	"user": "Emma",
            	"rating": 5,
            	"comment": "Orwell pulls it off well!"
        	},
        	{
            	"user": "Frank",
            	"rating": 4,
            	"comment": "Dystopian masterpiece"
        	}
    	]
	}
]

Clasificación de claves al convertir un diccionario de Python a JSON

La función dumps tiene varios parámetros opcionales. Ya hemos utilizado uno de esos parámetros opcionales sangría. Otro parámetro útil es sort_keys. Esto es especialmente útil cuando necesitas ordenar las claves del diccionario de Python al convertirlo a JSON.

Debido a que sort_keys está configurado en False de forma predeterminada, puede configurarlo en True si necesita ordenar las claves al convertir a JSON.

A continuación se muestra un diccionario persona sencillo:

import json

person = {
	"name": "John Doe",
	"age": 30,
	"email": "john@example.com",
	"address": {
    	"city": "New York",
    	"zipcode": "10001",
    	"street": "123 Main Street"
	}
}

# Convert dictionary to a JSON string with sorted keys
json_string = json.dumps(person, sort_keys=True, indent=4)
print(json_string)

Como se ve, las claves están ordenadas alfabéticamente:

Output >>>
{
	"address": {
    	"city": "New York",
    	"street": "123 Main Street",
    	"zipcode": "10001"
	},
	"age": 30,
	"email": "john@example.com",
	"name": "John Doe"
}

Manejo de datos no serializables

En los ejemplos que hemos codificado hasta ahora, las claves y los valores del diccionario son todos serializables en JSON. Todos los valores eran cadenas o números enteros para ser específicos. Pero puede que este no sea siempre el caso. Algunos tipos de datos no serializables comunes incluyen datetime, Decimal y set.

Pero no te preocupes. Puede manejar estos tipos de datos no serializables definiendo funciones de serialización personalizadas para esos tipos de datos. Y luego establecer el parámetro default de json.dumps() en las funciones personalizadas que defina.

Estas funciones de serialización personalizadas deberían convertir los datos no serializables a un formato serializable JSON (¡quién lo hubiera adivinado!).

A continuación se muestra un diccionario de datos sencillo:

import json
from datetime import datetime

data = {
	"event": "Meeting",
	"date": datetime.now()
}

# Try converting dictionary to JSON
json_string = json.dumps(data, indent=2)
print(json_string)

Hemos usado json.dumps() como antes, por lo que nos encontraremos con la siguiente excepción TypeError:

Traceback (most recent call last):
  File "/home/balapriya/djson/main.py", line 10, in 
	json_string = json.dumps(data, indent=2)
              	^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/__init__.py", line 238, in dumps
	**kw).encode(obj)
      	^^^^^^^^^^^
...
  File "/usr/lib/python3.11/json/encoder.py", line 180, in default
	raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable

La parte relevante del error es: El objeto de tipo datetime no es serializable en JSON. Bien, ahora hagamos lo siguiente:

  • Defina una función serialize_datetime que convierta objetos datetime al formato ISO 8601 utilizando el método isoformat().

  • Al llamar a json.dumps(), configuramos el parámetro default en la función serialize_datetime.

Entonces el código se ve de la siguiente manera:

import json
from datetime import datetime

# Define a custom serialization function for datetime objects
def serialize_datetime(obj):
	if isinstance(obj, datetime):
    	return obj.isoformat()

data = {
	"event": "Meeting",
	"date": datetime.now()
}

# Convert dictionary to JSON 
# with custom serialization for datetime
json_string = json.dumps(data, default=serialize_datetime, indent=2)
print(json_string)

Y aquí está el resultado:

Output >>>
{
  "event": "Meeting",
  "date": "2024-03-19T08:34:18.805971"
}

Conclusión

¡Y ahí lo tienes!

En resumen: repasamos la conversión de un diccionario de Python a JSON y el uso de los parámetros indent y sort_keys según sea necesario. También aprendimos cómo manejar los errores de serialización JSON.

Puede encontrar los ejemplos de código en GitHub. Los veré a todos en otro tutorial. Hasta entonces, ¡sigue codificando!

Artículos relacionados