美文网首页python进阶
python 解决datetime、date、decimal等类

python 解决datetime、date、decimal等类

作者: 落羽归尘 | 来源:发表于2019-08-22 22:53 被阅读0次

背景

在python中,我们使用json.dumps或者tornado的self.write等有关json序列化时,会遇到这些错误:

  • TypeError: Decimal('10') is not JSON serializable
  • TypeError: datetime.datetime(2019, 8, 22, 19, 37, 48, 481873) is not JSON serializable

解决办法:

import json
from decimal import Decimal
from datetime import datetime,date

class DateEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, datetime):
            return o.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(o, date):
            return o.strftime("%Y-%m-%d")
        elif isinstance(o, Decimal):
            return float(o)
        else:
            return json.JSONEncoder.default(self, o)


d = {"a":Decimal(10),"time":datetime.now(),"c":4}

str_ = json.dumps(d, cls=DateEncoder)
print(str_)

tornado中经常也会碰到这种问题,解决办法当然是重载write方法了,如下:

class DateEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, datetime.datetime):
            return o.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(o, datetime.date):
            return o.strftime("%Y-%m-%d")
        elif isinstance(o, Decimal):
            return float(o)
        else:
            return json.JSONEncoder.default(self, o)


class TestHandler(RequestHandler):
    def write(self, chunk):
        if self._finished:
            raise RuntimeError("Cannot write() after finish()")
        if not isinstance(chunk, (bytes, unicode_type, dict)):
            message = "write() only accepts bytes, unicode, and dict objects"
            if isinstance(chunk, list):
                message += ". Lists not accepted for security reasons; see " + \
                           "http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write"
            raise TypeError(message)
        if isinstance(chunk, dict):
            # 返回数据库数据中存在datetime、date,decimal格式,原write会报错
            chunk = json.dumps(chunk, cls=DateEncoder).replace("</", "<\\/")
            self.set_header("Content-Type", "application/json; charset=UTF-8")
        chunk = escape.utf8(chunk)
        self._write_buffer.append(chunk)

相关文章

网友评论

    本文标题:python 解决datetime、date、decimal等类

    本文链接:https://www.haomeiwen.com/subject/humosctx.html