datetime.date(2014,4,25)在Django中不是JSON可序列化的

Pra*_*dav 26 python django serialization datetime json

我跟着如何在python中克服"datetime.datetime而不是JSON serializable"?但这没有帮助

我试过这段代码

>>> import datetime
>>> a =datetime.date(2014, 4, 25)
>>> from bson import json_util
>>> b = json.dumps(a,default = json_util.default)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/home/.../python2.7/site-packages/bson/json_util.py", line 256, in default
    raise TypeError("%r is not JSON serializable" % obj)
TypeError: datetime.date(2014, 4, 25) is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我使用datetime.date序列化器和反序列化器.

Ale*_*ruC 64

你也可以这样做:

def date_handler(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj

print json.dumps(data, default=date_handler)
Run Code Online (Sandbox Code Playgroud)

这里开始.

根据JFSebastian评论更新

def date_handler(obj):
    if hasattr(obj, 'isoformat'):
        return obj.isoformat()
    else:
        raise TypeError

print json.dumps(data, default=date_handler)
Run Code Online (Sandbox Code Playgroud)


Nis*_*ede 12

将日期转换为字符串,然后尝试,

a = str( datetime.now() )
Run Code Online (Sandbox Code Playgroud)

  • `a = datetime.now().isoformat()`可能更清楚,特别是在将`a`反序列化为`datetime`对象时.Python [docs](https://docs.python.org/2/library/datetime.html)说`str(d)`相当于`d.isoformat()`. (8认同)
  • @Lucas:`str(d)` 等价于 `d.isoformat(' ')`(默认分隔符是 `'T'`,即 * 不* 等价于 `d.isoformat()`) (2认同)

Ste*_*ell 9

请参阅json包文档中的扩展编码器部分文档https://docs.python.org/2/library/json.html

我使用过这种方法,发现它非常有效.我想这就是你要找的东西.

import json
class DatetimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%dT%H:%M:%SZ')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default(self, obj)

json.dumps(dict,cls=DatetimeEncoder)
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以在处理模型查询集时将日期时间编码器添加到JSON跳转函数中,这是自定义的,因为我遇到了解析基本django模型状态的问题

import datetime
import decimal
from django.db.models.base import ModelState

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
       if hasattr(obj, 'isoformat'):
           return obj.isoformat()
       elif isinstance(obj, decimal.Decimal):
           return float(obj)
       elif isinstance(obj, ModelState):
           return None
       else:
           return json.JSONEncoder.default(self, obj)
Run Code Online (Sandbox Code Playgroud)

然后将此类与您的json转储一起使用

b = json.dumps(a, cls = DateTimeEncoder)
Run Code Online (Sandbox Code Playgroud)