Je souhaite générer un résultat lors de la conversion de la valeur du type (par exemple, datetime) qui n'est pas pris en charge lors de la sortie de json avec python.
Vous pouvez utiliser json.dumps (json.dump) lorsque vous essayez de convertir dict en json en python. À ce stade, si une valeur d'un type non pris en charge est incluse, l'exception suivante se produit.
# TypeError: datetime.datetime(2000, 1, 1, 0, 0) is not JSON serializable
Par exemple, si la personne du dictionnaire comprenant l'objet datetime est définie sur la spécification json.dumps, le résultat sera le suivant.
import json
from datetime import datetime
person = {
"name": "Foo",
"age": 20,
"created_at": datetime(2000, 1, 1)
}
json.dumps(person)
# TypeError: datetime.datetime(2000, 1, 1, 0, 0) is not JSON serializable
json.dumps peut prendre plusieurs arguments.
json.dumps = dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, inden
t=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)
Serialize ``obj`` to a JSON formatted ``str``.
...
Si vous attribuez la fonction suivante à l'argument par défaut dans this, vous pouvez spécifier le mappage pour l'argument non pris en charge ultérieurement.
def support_datetime_default(o):
if isinstance(o, datetime):
return o.isoformat()
raise TypeError(repr(o) + " is not JSON serializable")
Vous pouvez maintenant le convertir avec json.dumps.
person = {
"name": "Foo",
"age": 20,
"created_at": datetime(2000, 1, 1)
}
json.dumps(person, default=support_datetime_default)
# {"created_at": "2000-01-01T00:00:00", "age": 20, "name": "Foo"}
Vous pouvez changer la classe utilisée pour la conversion en json.dumps avec l'argument cls (json.JSONEncoder est utilisé par défaut) Par conséquent, vous pouvez définir une classe qui hérite de JSONEncoder comme indiqué ci-dessous et la transmettre à cls.
class DateTimeSupportJSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime):
return o.isoformat()
return super(DateTimeSupportJSONEncoder, self).default(o)
json.dumps(person, cls=DateTimeSupportJSONEncoder)
# {"created_at": "2000-01-01T00:00:00", "age": 20, "name": "Foo"}
Recommended Posts