2024-04-28 23:13:39 发布
网友
是否可以将datetime转换为可读的JSON格式(可以从javascript中使用)?目前jsonpickle只为datetime提供一个二进制编码值。在
对于当前版本的jsonpickle(从今天的pip获得),如果将unplickable设置为false,那么简单地使用encode似乎是有效的:
>>> import jsonpickle >>> from datetime import datetime >>> jsonpickle.encode(datetime.now(), unpicklable=False) '"2014-05-25 20:24:30.357299"'
但是,您的技巧可以用于生成ISO 8601 format,根据ECMAScript v5规范,这可能更合适:
经过一番反复试验,我想出了以下解决方案:
class DatetimeHandler(jsonpickle.handlers.BaseHandler): def flatten(self, obj, data): return obj.strftime('%Y-%m-%d %H:%M:%S.%f') jsonpickle.handlers.registry.register(datetime, DatetimeHandler) encoded_datetime = jsonpickle.encode(datetime.now()) print(encoded_datetime) decode_datetime = jsonpickle.decode(encoded_datetime) print(decode_datetime)
这里有几个陷阱:
首先,请不要在不知道日期时间对象的时区通信。你会感到痛苦,不是今天,也许不是明天,而是有一天。你可以从别人的错误(我的错误)中吸取教训,也可以从中吸取教训。就我而言,Python允许您生成不带时区的datetime对象是一个缺陷。在
第二,strptime不处理时区!所以你做了正确的事情,然后你用某种格式写下你的日期,然后想把它读回,卡布洛伊,你得到了'%z格式错误字符串。'Grr。在
使用iso8601库解析iso8601日期时间字符串。时区处理。在
第三,jsonpickle没有清楚地说明如何滚动您自己的DatetimeHandler。所以是的,你只是想要一些清晰易读的东西发送到Javascript或者别的什么?上面的解决方案就可以了。你想要一些清晰易读的东西,但你也希望在某个时候把它拉回到Python中?呃,更狡猾。在
这里有一个提示:当您将一个库子类化以扩展其功能时,请仔细查看您正在扩展的超类。在
我写DatetimeHandler时会有点不同。但下面的作品,包含了我在这个问题上来之不易的智慧。哎哟。在
import pytz import jsonpickle import iso8601 from datetime import datetime class Blah(object): def __init__(self, blah): self.datetime = datetime.now(pytz.utc) self.blah = blah def to_json(self): return jsonpickle.encode(self) @classmethod def from_json(cls, json_str): return jsonpickle.decode(json_str) class DatePickleISO8601(jsonpickle.handlers.DatetimeHandler): def flatten(self, obj, data): pickler = self.context if not pickler.unpicklable: return unicode(obj) cls, args = obj.__reduce__() flatten = pickler.flatten payload = obj.isoformat() args = [payload] + [flatten(i, reset=False) for i in args[1:]] data['__reduce__'] = (flatten(cls, reset=False), args) return data def restore(self, data): cls, args = data['__reduce__'] unpickler = self.context restore = unpickler.restore cls = restore(cls, reset=False) value = iso8601.parse_date(args[0]) return value jsonpickle.handlers.registry.register(datetime, DatePickleISO8601)
对于当前版本的jsonpickle(从今天的pip获得),如果将unplickable设置为false,那么简单地使用encode似乎是有效的:
但是,您的技巧可以用于生成ISO 8601 format,根据ECMAScript v5规范,这可能更合适:
^{pr2}$经过一番反复试验,我想出了以下解决方案:
这里有几个陷阱:
首先,请不要在不知道日期时间对象的时区通信。你会感到痛苦,不是今天,也许不是明天,而是有一天。你可以从别人的错误(我的错误)中吸取教训,也可以从中吸取教训。就我而言,Python允许您生成不带时区的datetime对象是一个缺陷。在
第二,strptime不处理时区!所以你做了正确的事情,然后你用某种格式写下你的日期,然后想把它读回,卡布洛伊,你得到了'%z格式错误字符串。'Grr。在
使用iso8601库解析iso8601日期时间字符串。时区处理。在
第三,jsonpickle没有清楚地说明如何滚动您自己的DatetimeHandler。所以是的,你只是想要一些清晰易读的东西发送到Javascript或者别的什么?上面的解决方案就可以了。你想要一些清晰易读的东西,但你也希望在某个时候把它拉回到Python中?呃,更狡猾。在
这里有一个提示:当您将一个库子类化以扩展其功能时,请仔细查看您正在扩展的超类。在
我写DatetimeHandler时会有点不同。但下面的作品,包含了我在这个问题上来之不易的智慧。哎哟。在
相关问题 更多 >
编程相关推荐