Jestem nowy w programowaniu w Pythonie mam obiekt słownika jak
data={
"joiningdate": datetime.datetime(2016, 10, 13, 0, 0),
"shift": datetime.time(8, 0)
}
chcę przekazać tę wartość do json co ja zrobiłem to
class MyEncoder1(json.JSONEncoder):
def default(self, obj):
if isinstance(obj,datetime.date):
obj= datetime.datetime.strptime(obj,"%Y-%m-%d ")
elif isinstance(obj, datetime.datetime):
obj= datetime.datetime.strptime(obj,"%Y-%m-%d %H:%M:%S.%f")
elif isinstance(obj, datetime.time):
obj = datetime.time.strftime(obj,"%H:%M:%S")
elif isinstance(obj, Decimal):
obj = float(obj)
else:
obj = super(MyEncoder1, self).default(obj)
return obj
json_array = dumps(data,cls=MyEncoder1)
czas drukowania to tylko 00:08:00 ale data nie jest drukowana czy ktoś może pomóc?
Odpowiedzi:
0 dla odpowiedzi № 1Tu są dwa błędy.
Po pierwsze, koder powinien zwrócić obiekt możliwy do serializacji, więc należy zastąpić wszystkie wywołania do strptime
z strftime
. strptime
konstrukcje datetime
obiekty z ciągu znaków (więc Twój kod rzuca TypeError
) i myślę, że chcesz czegoś przeciwnego.
Druga, datetime.datetime()
są w rzeczywistości przypadkami datetime.date
, więc gdy pole „data dołączenia” jest serializowane, wchodzi do pierwszego oddziału if i to jest to. Powinno działać, jeśli przełączysz if isinstance(obj,datetime.date)
i elif isinstance(obj, datetime.datetime)
:
class MyEncoder1(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
obj= datetime.datetime.strftime(obj,"%Y-%m-%d %H:%M:%S.%f")
elif isinstance(obj,datetime.date):
obj= datetime.datetime.strftime(obj,"%Y-%m-%d ")
elif isinstance(obj, datetime.time):
obj = datetime.time.strftime(obj,"%H:%M:%S")
elif isinstance(obj, Decimal):
obj = float(obj)
else:
obj = super(MyEncoder1, self).default(obj)
return obj