example dict deserialize create python json serialization simplejson

dict - ¿Por qué la serialización json de objetos datetime en python no funciona de la caja para objetos datetime?



simplejson python (4)

¿Cómo te gustaría que sean serializados?

JSON no especifica cómo manejar las fechas, por lo que la biblioteca python json no puede tomar una decisión sobre cómo representarlas. Eso depende completamente de cómo el otro lado (navegador, script, lo que sea) maneja las fechas en JSON también.

¿Por qué la serialización json no funciona para objetos de fecha y hora? Como entiendo la serialización json, la idea básica para cualquier objeto puede ser llamar a la función __str__ incorporada y luego urlencode el objeto que obtienes como respuesta. Pero en caso de datetime recibo el siguiente error

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

mientras que hay un __str__ es decir, una forma de stringificar el objeto ya disponible, pero parece una decisión consciente de no hacerlo, ¿por qué sería ese el caso?


No, no funciona de esa manera en el módulo json . El módulo le proporciona un codificador predeterminado: json.JSONEncoder . Debe extender esto para proporcionar su implementación del método default para serializar objetos. Algo como esto:

import json import datetime from time import mktime class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return int(mktime(obj.timetuple())) return json.JSONEncoder.default(self, obj) print json.dumps(obj, cls=MyEncoder)

Como otros señalaron correctamente, la razón es que el estándar para json no especifica cómo se puede representar la fecha.


Si desea obtener codificación y decodificación de json_tricks y json_tricks sin tener que implementarlo, puede usar json_tricks , que es un contenedor que agrega codificación y decodificación para varios tipos populares. Solo instala:

pip install json_tricks

y luego importar desde json_tricks lugar de json , por ejemplo:

from json_tricks import dumps, loads json = dumps({''name'': ''MyName'', ''birthday'': datetime.datetime(1992, 5, 23, 18, 38, 23, 37566)}) me = loads(json)

Descargo de responsabilidad: está hecho por mí. Porque tuve el mismo problema.

Si desea serializar automáticamente cualquier cosa que pueda ser codificada, puede hacerlo con la implementación estándar muy fácilmente:

dumps(obj, default=str)

Pero tenga en cuenta que esto tiene desventajas, por ejemplo, nada de esto se deserializará sin un esfuerzo extra, y tal vez a veces no quiera serializar algo (como una función de una matriz numpy grande), sino una advertencia, que este método hará silencio.


Una forma sencilla de parchear el módulo json de modo que la serialización sea compatible con la fecha y la hora.

import json import datetime json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)

Luego use la serialización json como siempre lo hace, esta vez con datetime siendo serializado como isoformat.

json.dumps({''created'':datetime.datetime.now()})

Resultando en: ''{"created": "2015-08-26T14: 21: 31.853855"}''

Vea más detalles y algunas palabras de advertencia en: : JSON datetime entre Python y JavaScript