Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird.
Sie können json.dumps (json.dump) verwenden, wenn Sie versuchen, dict in json in Python zu konvertieren. Wenn zu diesem Zeitpunkt ein Wert eines nicht unterstützten Typs enthalten ist, tritt die folgende Ausnahme auf.
# TypeError: datetime.datetime(2000, 1, 1, 0, 0) is not JSON serializable
Wenn beispielsweise die Wörterbuchperson, die das datetime-Objekt enthält, auf die Spezifikation json.dumps festgelegt ist, lautet das Ergebnis wie folgt.
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 kann mehrere Argumente annehmen.
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``.
...
Wenn Sie dem Standardargument in diesem Fall die folgende Funktion zuweisen, können Sie die Zuordnung für das nicht unterstützte später angeben.
def support_datetime_default(o):
if isinstance(o, datetime):
return o.isoformat()
raise TypeError(repr(o) + " is not JSON serializable")
Jetzt können Sie es mit json.dumps konvertieren.
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"}
Sie können die für die Konvertierung in json.dumps verwendete Klasse mit dem Argument cls ändern (standardmäßig wird json.JSONEncoder verwendet). Daher ist es in Ordnung, eine Klasse zu definieren, die JSONEncoder wie unten gezeigt erbt, und diese an cls zu übergeben.
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"}