pythonjson序列化_dumps与loads处理字典、类与日期时间技巧

json.dumps序列化datetime需用default参数转isoformat,反序列化需object_hook手动还原;避免__dict__陷阱,推荐to_dict方法;中文输出须设ensure_ascii=False和indent。

json.dumps 序列化字典时遇到 datetime 报错

直接用 json.dumps() 处理含 datetime 对象的字典会抛出 TypeError: Object of type datetime is not JSON serializable。Python 标准库不支持原生序列化日期时间类型。

解决方法是传入 default 参数,提供一个可调用对象来转换非标准类型:

import json
from datetime import datetime

data = {"name": "Alice", "created_at": datetime.now()}

json_str = json.dumps(data, default=lambda obj: obj.isoformat() if hasattr(obj, 'isoformat') else None)

输出类似:{"name": "Alice", "created_at": "2025-05-20T14:23:11.123456"}

  • 优先用 obj.isoformat(),它比 str(obj) 更规范、可逆性强
  • 避免在 default 中无条件返回 str(obj),否则可能把意外类型(如自定义类、bytes)也转成字符串,掩盖真正问题
  • 如果需要 UTC 时间,记得先调用 obj.astimezone(timezone.utc)isoformat()

用 json.loads 反序列化后还原 datetime 对象

json.loads() 默认只返回 dictliststr 等基础类型,不会自动把 ISO 格式字符串变回 datetime。得靠 object_hook 手动识别和转换。

常见做法是在加载时扫描 key 名或值格式:

Midjourney

当前最火的AI绘图生成工具,可以根据文本提示生成华丽的视觉图片。

下载

import json
from datetime import datetime

def datetime_hook(d): for k, v in d.items(): if k == "created_at" and isinstance(v, str): try: d[k] = datetime.fromisoformat(v.replace("Z", "+00:00")) except ValueError: pass return d

data = json.loads('{"name": "Alice", "created_at": "2025-05-20T14:23:11.123456"}', object_hook=datetime_hook)

  • 不要全局匹配所有字符串字段——容易误转 ID、手机号等纯数字字符串
  • fromisoformat() 支持带 Z 的 UTC 表示,但需手动替换为 +00:00,否则报错
  • 若字段名不固定(比如日志中多个时间字段),可用正则匹配 r"^(at|time|date|ts)$" 这类后缀

序列化自定义类实例时绕过 __dict__ 陷阱

直接对类实例调用 json.dumps(obj) 会失败;有人习惯写 json.dumps(obj.__dict__),但这有隐患:丢失方法、忽略私有属性(_attr)、跳过 property 计算属性、无法处理循环引用。

更可控的方式是显式定义导出逻辑:

class User:
    def __init__(self, name, joined_at):
        self.name = name
        self.joined_at = joined_at
        self._internal_id = 123  # 不应被序列化
def to_dict(self):
    return {
        "name": self.name,
        "joined_at": self.joined_at.isoformat(),
        "is_active": True  # 可加入计算字段
    }

user = User("Bob", datetime.now())
json.dumps(user.to_dict())

  • 别依赖 __dict__,尤其当类用了 __slots__ 或 dataclass + __post_init__ 时,__dict__ 可能为空或不完整
  • 如果类结构复杂且多处复用,可封装一个通用 as_json() 方法,内部统一处理 datetime、枚举、嵌套对象
  • 想保持接口简洁,也可重载 __json__() 方法(非标准,但部分工具链识别),不过仍推荐显式 to_dict()

处理中文、特殊字符与缩进时的编码细节

默认情况下 json.dumps() 会将非 ASCII 字符(如中文)转义为 \uXXXX,且输出无空格。这不利于调试和人工阅读。

两个关键参数必须明确设置:

json.dumps(data, ensure_ascii=False, indent=2)
  • ensure_ascii=False 是硬性要求,否则中文变 \u4f60\u597d,后续系统若没正确 decode 就乱码
  • indent=2 仅用于开发或日志,线上 API 响应建议保持默认(无缩进),减少传输体积
  • 若要兼容旧版 Python(default 返回 date 对象——json 模块不认它,得先转成 datetime 或字符串

最易被忽略的是时区信息:没有显式标注时区的 datetime 对象,isoformat() 输出不带 offset,反序列化后仍是“本地时间”语义,跨系统传递时极易出错。宁可全链路强制用 UTC 并显式标注。

相关推荐:

《太吾绘卷:天幕心帷》游戏特殊隐藏技巧分享

《太吾绘卷:天幕心帷》中是有很多比较独特的隐藏技巧的,知道了这些技巧就能够解决很多问题,首先是游戏设置资质与拾取,我们的人物属性界面,在我们初始选择的时候,我们把制木改成零。 太吾绘卷天幕心帷有什么隐藏技巧 本文内容来源于互联网,如有侵权请联系删除。

《太吾绘卷:天幕心帷》打BOSS玩法技巧分享

《太吾绘卷:天幕心帷》中打BOSS的技巧是非常多的,想要看懂怎么打BOSS就需要一些方法,首先我们初期要面对的就是9个剑冢BOSS,如果你破冢速度选择了停止,那你随时可以选择你想打的。 太吾绘卷天幕心帷怎么打BOSS 本文内容来源于互联网,如有侵权请联系删除。

从前有条街萌宠大塞玩法技巧分享

从前有条街萌宠大塞玩法,点开【萌宠养成】,【特性养成】,选分享集赞,等三个特性出来后再来培养,培养时可以考虑和特性想呼应。集赞每天都要做,首次分享会送10点培养点。 从前有条街萌宠大塞玩法技巧分享: 一、培养小技巧 1.开局培养点先不用,先分享集赞解锁。 点开【萌宠养成】,【特性养成】,选分享集赞,等三个特性出来后再来培养,培养时可以考虑和特性想呼应。集赞每天都要做,首次分享会送10点培养点。 每...

乱轰三国武将突破技巧

乱轰三国武将怎么突破,突破的核心就是消耗同阵营卡(注意哦绝世武将突破是本体卡+同名卡哦)不同武将品质的突破,消耗同阵营卡的等级也不同。比如从卓越 + 到传奇,就要用卓越+的同阵营卡才可以突破,今天就给大家分享一波武将突破的干货。 乱轰三国武将突破技巧: 一、突破准备 突破前可以先看看自己是否有重复的武将,比如一个高突破等级的吕布和一个低突破等级的吕布,此时你就可以先回退或重生武将,先获取一波培养资...

江南百景图冰钓技巧分享

江南百景图冰钓怎么玩,闲着没事多钓鱼,渔具升级先鱼线再钓竿(不同品种的鱼分布在不同深度,钓出新品种奖励冻梨),亲测每抛竿100次可获得12-16个宝箱。 江南百景图冰钓技巧分享: 一、冰钓技巧 1、浅水(3~5米)钓出宝箱的概率比钓出珍稀鱼类(如玳瑁)的概率还高 2、渔具升级先鱼线再钓竿(不同品种的鱼分布在不同深度,钓出新品种奖励冻梨) 3、7款钓竿(已出4款):普通、竹制(加失误次数)、守拙(不...

PR软件隐藏技巧大公开:用预合成搞定复杂的特效叠加【技巧】

预合成是Premiere中封装多图层、蒙版、混合模式与动态遮罩的必备方法。它将复杂组合打包为单个嵌套序列,仅暴露位置、缩放、不透明度、旋转四个可控参数,隔离内部逻辑,避免修改引发连锁错位;三步完成:框选图层→右键新建序列→拖回覆盖原图层;后续可在内外层级分别精准调控,转场须置于预合成之间而非内部。 想在Premiere中把多个图层、蒙版、混合模式和动态遮罩组合成一个可控的整体,又怕时间轴越来越乱、...

OPPO Reno2游戏免打扰与弹幕通知设置全攻略【技巧】

OPPO Reno2游戏时需分开设置弹幕通知与屏蔽通知:开启弹幕通知让微信等消息以横幅形式显示,不被免打扰影响;启用屏蔽通知可静音非白名单应用,保留关键消息弹幕。 想在OPPO Reno2打游戏时不被微信、短信弹窗打断,又想让关键消息以弹幕形式浮在屏幕上方?这两个功能必须分开设置,且开关位置容易混淆——误关弹幕会错过队友喊话,误开免打扰又会让闹钟也静音。 开启游戏弹幕通知 弹幕通知是独立于系统免打...

Devin AI隐藏技巧:内置工具与快捷键高效使用【技巧】

Devin AI隐藏快捷键可大幅提升效率:Ctrl+Shift+D/Cmd+Shift+D直启主工作区;Ctrl+`秒切编辑器与Shell;/shell、/debug、/stop精准控制AI行为;Ctrl+Shift+H收起工具栏,/browse唤起浏览器。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 想在Devin AI中快速调用内置工...