date(2014,4,25)不能在Django中进行JSON序列化


编辑

这个问题不是"如何克服"的重复;datetime.datetime不可JSON序列化"?因为,尽管这是同一个问题,但它提供了一个特定的上下文:Django。因此,有一些解决方案适用于此处,但不适用于所提供链接的问题。


原始问题

我遵循"如何克服";datetime.datetime不可JSON序列化"?但这对没有帮助

我试过这个代码

>>> 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

有人能帮我一个datetime.date串行器和反序列化器吗。

您也可以这样做:

def date_handler(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj
print json.dumps(data, default=date_handler)

从这里开始。

根据J.F.Sebastian评论更新

def date_handler(obj):
    if hasattr(obj, 'isoformat'):
        return obj.isoformat()
    else:
        raise TypeError
print json.dumps(data, default=date_handler)

将日期转换为等效的iso格式,

In [29]: datetime.datetime.now().isoformat()
Out[29]: '2020-03-06T12:18:54.114600'

请参阅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)

在处理模型查询集时,您可以在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)

然后将这个类与json转储一起使用

b = json.dumps(a, cls = DateTimeEncoder)

我发现这是非常宝贵的,尤其是在Django从1.7更新到1.9之后。大部分来自博客http://arthurpemberton.com/2015/04/fixing-uuid-is-not-json-serializable把这个放在models.py里,放在进口商品下面。它也会为您处理UUID。

from uuid import UUID
import datetime
JSONEncoder_olddefault = JSONEncoder.default
def JSONEncoder_newdefault(self, o):
    if isinstance(o, UUID): return str(o)
    if isinstance(o, datetime.datetime): return str(o)
    return JSONEncoder_olddefault(self, o)
JSONEncoder.default = JSONEncoder_newdefault

相关内容

  • 没有找到相关文章

最新更新