python字典和json字符串相互转化方法
Python 的字典和 JSON 字符串之间的相互转化这事儿,看起来挺简单,几行代码就能搞定,但你真要是在面试里被问到这个点,光报个 json.loads() 和 json.dumps() 是远远不够的……除非你只想混个 Hello World 水平的岗位 😅
我有次在面试一个人,对方说自己熟练掌握 Python JSON 操作。我随口问了一句:"那字典中含有 datetime 类型怎么办?" 他愣住了,然后开始百度……
好了,回到正题,讲讲我对这个问题的一些认知。
Python 字典转 JSON 字符串,用的是 json.dumps(),反过来 JSON 字符串转字典,则是 json.loads()。这两个 API 来自标准库 json,一行就能搞定,代码如下:
import json
data = {'name': '张三', 'age': 25}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str) # {"name": "张三", "age": 25}
dict_obj = json.loads(json_str)
print(dict_obj) # {'name': '张三', 'age': 25}
注意上面我加了个 ensure_ascii=False,默认情况下中文会被转成 Unicode,看着糟心,如果你想让 JSON 字符串保留中文,那就加上这个参数。
但别高兴得太早,这只是基础。你要是写后台接口,难免遇到这种结构:
from datetime import datetime
data = {
'user': '老王',
'login_time': datetime.now()
}
json.dumps(data)
直接报错:TypeError: Object of type datetime is not JSON serializable。
解决办法有两个方向:
第一种是自定义序列化器:
json.dumps(data, default=str)
这个最暴力,凡是不能序列化的对象,都转成字符串。但这就像把所有异常都 catch 住然后 print,一看就不够优雅。
更推荐的是你写个更细致的处理逻辑,比如:
defjson_encoder(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Type {type(obj)} not serializable")
json_str = json.dumps(data, default=json_encoder)
这样你就能控制具体类型的处理方式,后续反序列化还能还原回来,给前端传数据也清晰。
当然啦,反序列化也有坑。比如你从 JSON 字符串中恢复数据,像下面这样:
s = '{"login_time": "2023-06-01T15:33:00"}'
json.loads(s)
你拿到的是字符串,得自己判断是不是 ISO 格式时间,再做处理,这里就得靠你业务逻辑中对字段的定义约定了。
我以前踩过的一个坑是,团队里有个实习生搞了个配置中心,配置 JSON 写在数据库里,字段乱七八糟,啥都可能有,最终我们不得不手动解析、做大量兼容逻辑,痛不欲生 😵💫。
如果你经常要处理复杂结构的字典、包含嵌套、日期、自定义类型,建议直接用第三方库 orjson 或 ujson,性能更好,支持也更丰富一些,尤其是 orjson,我现在项目里基本都靠它:
import orjson
data = {'name': '老王', 'created': datetime.now()}
s = orjson.dumps(data, default=str).decode()
print(s)
总结几个实用技巧吧:
json.dumps(obj, ensure_ascii=False, default=str)是最基本的兼容写法;自定义 default参数函数处理datetime等非标准类型;JSON 字符串转字典后注意类型转换(比如时间、Decimal); 复杂结构建议考虑 pydantic做数据模型校验 + 自动转换;性能要求高可以上 orjson,它几乎是最快的 JSON 库;千万别用 eval()去解析 JSON,哪怕你再懒,再赶时间也别干这种事 👿
最后提醒一句,别觉得 Python 的 JSON 就是字典和字符串的事,涉及业务逻辑的地方,它就是个坑 —— 字符串转结构?结构转字符串?字段兼容?API 变更?一个不小心你就成了"Bug修复小王子"
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。