Python技术迷

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)

总结几个实用技巧吧:

  1. json.dumps(obj, ensure_ascii=False, default=str) 是最基本的兼容写法;
  2. 自定义 default 参数函数处理 datetime 等非标准类型;
  3. JSON 字符串转字典后注意类型转换(比如时间、Decimal);
  4. 复杂结构建议考虑 pydantic 做数据模型校验 + 自动转换;
  5. 性能要求高可以上 orjson,它几乎是最快的 JSON 库;
  6. 千万别用 eval() 去解析 JSON,哪怕你再懒,再赶时间也别干这种事 👿

最后提醒一句,别觉得 Python 的 JSON 就是字典和字符串的事,涉及业务逻辑的地方,它就是个坑 —— 字符串转结构?结构转字符串?字段兼容?API 变更?一个不小心你就成了"Bug修复小王子" 

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取