【问题标题】:Object of type datetime is not JSON serializable errordatetime 类型的对象不是 JSON 可序列化错误
【发布时间】:2019-06-03 16:15:43
【问题描述】:

我在 python 中使用 DateTime 值时遇到了一些问题。当我在以下代码中使用 session_start 时,我得到一个类型为 datetime 的 Object is not JSON serializable 错误

views.py

    dataSourceBar = {}
    dataSourceBar['chart'] = {
        "caption": "Rainfall",
            "subCaption": "Shown per date",
            "xAxisName": "Session",
            "yAxisName": "Rainfall in MM",
            "theme": "candy"
        }

    dataSourceBar['data'] = []  

    objects_with_category_id_2 = dashboard_input.objects.filter(category_category_id=2)

    for obj in objects_with_category_id_2:
        data =  {'label': obj.session_start,
                 'value': obj.input_input_value}
        dataSourceBar['data'].append(data)  

模型.py

class dashboard_input(models.Model):
    session_start = models.DateTimeField(max_length=100)

追溯

Internal Server Error: /dashboard/
Traceback (most recent call last):
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\var\www\VSDK\vsdk\dashboard\views.py", line 69, in Chart
    return  render(request, 'dash.html', {'output' : column2D.render(),'output2' : doughnut3d.render()})
  File "C:\var\www\VSDK\vsdk\dashboard\fusioncharts.py", line 52, in render
    self.readyJson = json.dumps(self.constructorOptions, ensure_ascii=False)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable

我从数据库视图中检索值,该视图由用户填写其数据的其他表填充。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python json django


    【解决方案1】:

    正如错误消息所说,json 无法将 datetime 对象自动转换为字符串或字典。看来您的视图函数在将所有内容发送到前端或渲染之前将其转换为 json。

    您需要做的就是将 DateTime 对象显式转换为字符串,以便您的代码工作:

    for obj in objects_with_category_id_2:
            data =  {'label': str(obj.session_start),
                     'value': obj.input_input_value}
            dataSourceBar['data'].append(data) 
    

    或者使用 datetime 的内置函数来格式化它。对于 ISO 格式,使用 .isoformat():

    for obj in objects_with_category_id_2:
            data =  {'label': obj.session_start.isoformat(),
                     'value': obj.input_input_value}
            dataSourceBar['data'].append(data) 
    

    如果您希望日期具有不同的格式,您可以使用 datetime.strftime(format) 函数,该函数接受一个包含生成日期字符串格式的字符串。查看日期时间包文档:https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior

    可能是这样的:

    for obj in objects_with_category_id_2:
            data =  {'label': obj.session_start.strftime("%d.%m.%Y"),
                     'value': obj.input_input_value}
            dataSourceBar['data'].append(data) 
    

    祝你好运!

    【讨论】:

    • 谢谢!我试图用更复杂的代码来修复它,但它比我想象的要容易得多!
    • 精彩;我使用了内置的“ISO”功能
    【解决方案2】:

    在您的代码中,模型上有一个 Datetime 字段。当您引用它是一个日期时间对象时,正如错误所说,它是不可序列化的。

    您可以通过将其显式转换为字符串来解决此问题,如下所示:

    for obj in objects_with_category_id_2:
        data =  {'label': str(obj.session_start),
                 'value': obj.input_input_value}
        dataSourceBar['data'].append(data)  
    

    我不知道 `obj.input_input_value 将是什么类型,但您可能需要也可能不需要强制转换。不先尝试,看看这是否适合您。

    【讨论】:

    • 谢谢!这比我想象的要容易:)
    猜你喜欢
    • 2022-12-21
    • 2021-01-19
    • 1970-01-01
    • 2019-04-29
    • 2021-12-24
    • 2021-06-07
    • 2018-10-28
    • 2016-07-07
    • 2017-04-22
    相关资源
    最近更新 更多