烧瓶datetime.date不可JSON序列化

时间:2019-03-08 01:18:00

标签: python flask

我试图返回返回的字典列表作为get请求的一部分。我正在调用下面的函数。

def get_data(id):
  selected_data = Database.get_date(id)
  json.dumps(selected_data, default=str)
  return jsonify({'data': selected_data})

selected_data就像

[{'date': datetime.date(2019, 1, 15), 'id': 1, 'name': 'John '}, {'date': datetime.date(2019, 1, 11), 'id': 2, 'name': 'Jane'}]

但是,我收到下面的错误

TypeError(repr(o)+“不可JSON序列化”) TypeError:datetime.date(2019,1,15)不可JSON序列化

我已经尝试过使用this stack overflow线程建议的json.dumps,但仍然遇到相同的错误。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

尝试以下任一方法

selected_data["date"] = selected_data["date"].isoformat()
selected_data["date"] = selected_data["date"].strftime("%Y-%m-%d %H:%M:%S:%f")
selected_data["date"] = str(selected_data["date"])

答案 1 :(得分:0)

您应该实现一个客户JSONEncoder

import json
from datetime import date
from datetime import datetime
class JsonExtendEncoder(json.JSONEncoder):
    """
        This class provide an extension to json serialization for datetime/date.
    """
    def default(self, o):
        """
            provide a interface for datetime/date
        """
        if isinstance(o, datetime):
            return o.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(o, date):
            return o.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, o)
if __name__ == '__main__':
    d = {'now': datetime.now(), 'today': date.today(), 'i': 100}
    ds = json.dumps(d, cls=JsonExtendEncoder)
    print "ds type:", type(ds), "ds:", ds
    l = json.loads(ds)

答案 2 :(得分:0)

这是我的方法。对于flask 和flask-restful 用户

class ReversingIntegerNumber {
    
    public int reverse(int originalNum) {
        boolean originalIsNegative = originalNum > 0 ? false : true;
        int reverseNum = 0;
        int modValue;
        originalNum = Math.abs(originalNum);
        while(originalNum != 0) {
            modValue = originalNum % 10;
            if(reverseNum > (Integer.MAX_VALUE - modValue)/10) {
                return 0;
            }
            reverseNum = (reverseNum * 10) + modValue;
            originalNum /= 10;
        }
        return originalIsNegative ? -1 * reverseNum : reverseNum;
    }
}