首页 > Python > 利用python的模块缓存机制使JSON库支持datetime类型
201211月5

利用python的模块缓存机制使JSON库支持datetime类型

前提

       在python运行环境中已加载模块会存在于sys.modules,import 已加载模块只是将sys.module中对应模块引到local命名空间,多个文件多次import同一模块内存中为同一模块对象。

实现

       因此我们可以通过修改已加载的模块来达到修改标准库的目的,gevent框架就是通过这种方式来监控调度方法的运行状态,这里我们也使用gevent的patch方式。

#monkey.py
# -*- coding: utf-8 -*-
import json
import datetime

class _JSONEncoder(json.JSONEncoder):
    """
    JSONEncoder subclass that knows how to encode date/time.
    """

    def default(self, o):
        # See "Date Time String Format" in the ECMA-262 specification.
        if isinstance(o, datetime.datetime):
            r = o.isoformat()
            if o.microsecond:
                r = r[:23] + r[26:]
            if r.endswith('+00:00'):
                r = r[:-6] + 'Z'
            return r
        elif isinstance(o, datetime.date):
            return o.isoformat()
        else:
            return super(_JSONEncoder, self).default(o)

def patch_json():
    def dumps(obj, *args, **kwargs):
        return _JSONEncoder(*args, **kwargs).encode(obj)
    json.dumps = dumps
#test.py
# -*- coding: utf-8 -*-
import datetime
import json
import monkey
monkey.patch_json()

if __name__ == '__main__':
    print json.dumps({'now': datetime.datetime.now()})

       这样就在没有修改json模块源码的情况下使其支持dumps datetime类型,也算的上是非侵入式补丁了。

文章作者: iitshare
本文地址:http://www.iitshare.com/python-json-datetime.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

更多
本文目前尚无任何评论.

发表评论