在Celery中反序列化datetime字符串的方法是使用自定义的JSONEncoder和JSONDecoder。
首先,我们需要创建一个自定义的JSONEncoder类,用于将datetime对象转换为字符串。可以使用datetime对象的isoformat()方法将其转换为ISO 8601格式的字符串。
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
接下来,我们需要创建一个自定义的JSONDecoder类,用于将字符串转换回datetime对象。可以使用datetime模块的datetime.fromisoformat()方法将ISO 8601格式的字符串转换为datetime对象。
from datetime import datetime
class CustomDecoder(json.JSONDecoder):
def __init__(self, *args, **kwargs):
super().__init__(object_hook=self.object_hook, *args, **kwargs)
def object_hook(self, dct):
for key, value in dct.items():
if isinstance(value, str):
try:
dct[key] = datetime.fromisoformat(value)
except ValueError:
pass
return dct
现在,我们可以使用这些自定义的编码器和解码器来序列化和反序列化包含datetime对象的数据。
import json
from datetime import datetime
from celery import Celery
app = Celery('myapp', broker='redis://localhost:6379/0')
@app.task
def my_task():
data = {
'name': 'John',
'dob': datetime(1990, 1, 1),
}
# 序列化数据
serialized_data = json.dumps(data, cls=CustomEncoder)
# 反序列化数据
deserialized_data = json.loads(serialized_data, cls=CustomDecoder)
print(deserialized_data['dob']) # 输出: 1990-01-01 00:00:00
在这个例子中,我们定义了一个包含datetime对象的字典,并使用自定义的编码器将其序列化为JSON字符串。然后,我们使用自定义的解码器将JSON字符串反序列化为字典,并打印出其中的datetime对象。
这是一个基本的示例,你可以根据自己的需求进行修改和扩展。
领取专属 10元无门槛券
手把手带您无忧上云