You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python JSON模块无法序列化date对象?已写处理代码仍报错求排查

问题排查与解决建议

核心错误原因

你已经编写了处理date/datetime序列化的format_item函数,也生成了处理后的result_list_serializable,但最终JSON序列化的还是原始的result_list——里面未处理的date/datetime对象直接触发了序列化失败。看这段关键代码:

else:
    result_list_serializable = [list(format_item(item) for item in tup) for tup in result_list]
    print('[RESULT SERIALIZER] :', result_list_serializable)

return {
    'statusCode': 200,
    'headers': {
        'Content-Type': 'application/json'
    },
    'body': json.dumps(result_list)  # 这里误用了原始未处理的列表
}

次要逻辑问题(format_item函数)

  1. 第一个判断if item is None:里的isinstance(item, (Decimal, float))完全无效——item已经是None,不可能是Decimal或float类型,属于逻辑冗余。
  2. 最后else分支的return "" if item is None else item多余,前面已经判断过item is None的情况,直接返回item即可。
  3. 类型判断顺序错误:datetime是date的子类,先判断date会导致datetime对象被误判为date类型,无法进入专属处理逻辑。

修复步骤与代码修改

1. 修正序列化对象

把return语句里的result_list替换为处理后的result_list_serializable:

return {
    'statusCode': 200,
    'headers': {
        'Content-Type': 'application/json'
    },
    'body': json.dumps(result_list_serializable)  # 使用处理后的可序列化列表
}

2. 修复format_item函数逻辑

调整类型判断顺序,清理冗余逻辑:

def format_item(item):
    if item is None:
        return ""
    elif isinstance(item, (Decimal, float)):
        return float(item)
    elif isinstance(item, datetime):
        if item.hour == 0 and item.minute == 0 and item.second == 0:
            return item.strftime('%Y-%m-%d')
        else:
            return item.strftime('%Y-%m-%d %H:%M:%S')
    elif isinstance(item, date):
        return item.isoformat()
    else:
        return item

3. 可选优化:自定义JSON编码器

如果不想手动遍历处理每个元素,可以自定义JSON编码器,简化代码:

from json import JSONEncoder

class DateTimeEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            if obj.hour == 0 and obj.minute == 0 and obj.second == 0:
                return obj.strftime('%Y-%m-%d')
            else:
                return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, date):
            return obj.isoformat()
        elif isinstance(obj, (Decimal, float)):
            return float(obj)
        elif obj is None:
            return ""
        return JSONEncoder.default(self, obj)

使用时直接传入cls参数,无需手动生成result_list_serializable:

json.dumps(result_list, cls=DateTimeEncoder)

内容的提问来源于stack exchange,提问作者user3521180

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:05:18