Foto de Ciprian Boiciuc en Unsplash Bienvenido a nuestro tutorial sobre la serialización de cursores PyMongo en JSON. En este artículo, cubriremos cómo manejar correctamente los objetos ObjectId y datetime, así como cualquier otro objeto, utilizando un JSONEncoder personalizado. Una tarea común cuando se trabaja con PyMongo es la necesidad de serializar datos para almacenarlos o transferirlos a través de una red. En este tutorial, veremos cómo serializar un cursor PyMongo, que es una estructura de datos común utilizada para almacenar los resultados de una consulta MongoDB, en formato JSON. Un error comúnmente informado al hacerlo es el siguiente TyperError:TypeError: ObjectId (”) no es JSON serializable. También profundizaremos en cómo manejar correctamente tipos de datos complejos como ObjectId y objetos de fecha y hora, que no se pueden serializar directamente en JSON. Le mostraremos cómo usar un JSONEncoder personalizado para manejar correctamente estos objetos y cualquier otro tipo de objeto personalizado que pueda tener en su cursor PyMongo. Entonces, si desea aprender a serializar cursores PyMongo en JSON y manejar tipos de datos complejos, siga leyendo !
El JSONEncoder, que es miembro del módulo json de la biblioteca estándar, es un codificador JSON extensible para estructuras de datos de Python. De forma predeterminada, admite las siguientes serializaciones:+—————————————- -+——–+
| pitón | JSON |
+——————————————————–+——- -+
| dictar | objeto |
| lista, tupla | matriz |
| calle | cadena |
| enumeraciones derivadas de int, float, int y float | número |
| Verdadero | cierto |
| Falso | falso |
| Ninguno | nulo |
+——————————————————–+——- -+Esto significa que cada vez que se observe un objeto de un tipo de datos diferente (que no se encuentra en la lista de la tabla anterior), se generará un TypeError. Al trabajar con documentos en Mongo, de forma predeterminada, cada documento tendrá un _id asignado que corresponde a un identificador único para cada documento dentro de una colección. Ahora, cada vez que consulte una colección de Mongo, se devolverá un cursor que contiene (un puntero a) los documentos recuperados donde cada documento también tendrá el campo _id de tipo ObjectId. Por lo tanto, si intenta serializar dichos documentos utilizando el JSONEncoder predeterminado, terminará obteniendo el error mencionado en la introducción de este tutorial: TypeError: ObjectId(”) no es JSON serializable. Por lo tanto, para lograr serializar dichos objetos contenidos en el cursor PyMongo, necesitamos extender el JSONEncoder predeterminado maneja adecuadamente tales tipos de datos de la manera que nos gustaría. Para lograr esto, también necesitaremos implementar el método predeterminado para devolver el mapeo que deseamos, como se especifica en la documentación.
Para extender esto para reconocer otros objetos, cree una subclase e implemente un método predeterminado () con otro método que devuelva un objeto serializable para o si es posible; de lo contrario, debería llamar a la implementación de la superclase (para generar TypeError).— Documentación de Python
En nuestro JSONEncoder personalizado, estoy a punto de serializar cualquier instancia de bson.ObjectId y datetime.datetime a str. Dependiendo de los documentos contenidos en su propio cursor Mongo, es posible que deba especificar y manejar tipos de datos adicionales (o quizás menos). importar json
desde fechahora fechahora de importación
al escribir import Anyfrom bson import ObjectIdclass MongoJSONEncoder(json.JSONEncoder):
def predeterminado(self, o: Cualquiera) -> Cualquiera:
si es una instancia (o, ObjectId):
devolver str(o)
si es una instancia (o, fecha y hora):
devolver str(o)
devuelve json.JSONEncoder.default(self, o)
Finalmente, en caso de que desee convertir el objeto JSON recién creado en un objeto de Python (es decir, una lista de diccionarios que contienen los pares clave-valor que corresponden a los valores del documento dentro del cursor de Mongo), todo lo que necesita llamar es json Función .loads():data_obj = json.loads(data_json)
En este tutorial, aprendimos cómo serializar cursores de PyMongo en JSON y manejar correctamente tipos de datos complejos como ObjectId y objetos de fecha y hora. Logramos esto mediante la creación de un JSONEncoder personalizado que amplió el JSONEncoder predeterminado e implementó un método predeterminado(). Luego, usamos este codificador personalizado para codificar el cursor PyMongo y, finalmente, convertimos el objeto JSON resultante en un objeto Python usando json. carga() función. Este tutorial demostró cómo manejar objetos ObjectId y datetime, pero el JSONEncoder personalizado también se puede ampliar para manejar cualquier otro tipo de objeto personalizado que pueda estar presente en el cursor de PyMongo.
Los días felices de la PDA y Blackberry han quedado definitivamente atrás, pero el factor…
Tutorial sobre cómo pronosticar usando un modelo autorregresivo en PythonFoto de Aron Visuals en UnsplashForecasting…
Si tienes un iPhone, los AirPods Pro son la opción obvia para escuchar música, ¡aunque…
Ilustración de Alex Castro / The Verge Plus nuevos rumores sobre el quinto Galaxy Fold.…
Se rumorea que los auriculares premium de próxima generación de Apple, los AirPods Max 2,…
El desarrollador Motive Studio y el editor EA han lanzado un nuevo tráiler de la…