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 objetosdatetime
al formato ISO 8601 utilizando el métodoisoformat()
.- Al llamar a
json.dumps()
, configuramos el parámetrodefault
en la funciónserialize_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!