用 Python 处理数据的朋友是不是常遇到这些情况?从 API 接口拿到一串 JSON 数据,想提取里面的关键信息却总是报错;想把 Python 字典存成 JSON 文件,打开一看中文全变成了 “\u5c0f\u660e” 这样的乱码;处理嵌套 JSON 时,层级太深不知道怎么一层层取数据,对着屏幕发呆。别慌,兔子哥刚开始用 Python 操作 JSON 时,光是搞懂
dumps和dump的区别就花了一下午,把列表直接存成 JSON 更是报了一堆格式错误。今天就带大家从基础方法到实战案例,把 Python 解析和生成 JSON 的技巧讲透,新手跟着学,轻松搞定各种 JSON 数据处理需求!一、先搞懂:Python 为啥要学 JSON?这 3 个场景离不开它
可能有朋友会问:“我用 Python 字典存数据挺好的,为啥非要学 JSON?” 这你就不知道了,JSON 是一种通用的数据格式,能在不同编程语言之间 “传递消息”,而 Python 的字典只能在 Python 里用。
你想想,爬取数据后要传给前端展示,前端不认识 Python 字典,但认识 JSON;写程序时要保存配置信息,JSON 文件比 txt 文本结构更清晰,比 Excel 更轻量;调用第三方 API 接口,返回的数据几乎都是 JSON 格式,不会解析可不行。
简单说,JSON 就是数据的 “通用翻译官”,Python 的
json模块就是 “翻译工具”,学会用这个工具,处理数据交换和存储的问题会轻松一大截。二、核心方法:4 个函数搞定 JSON 读写,基础必须吃透
Python 自带的
json模块不用额外安装,这 4 个核心函数学会了,JSON 的解析和生成就没问题了,咱们一个个讲明白。- dumps ():把 Python 数据转成 JSON 字符串
当你需要把 Python 的字典、列表转成字符串(比如传给前端、存到数据库),用dumps()就对了。
示例:
python
import json# 定义一个Python字典user = {"name": "小明","age": 18,"hobby": ["篮球", "游戏"],"is_student": True}# 转成JSON字符串json_str = json.dumps(user, ensure_ascii=False, indent=2)print(json_str)运行后会输出格式化的 JSON 字符串,中文正常显示,还有缩进。这里的
ensure_ascii=False是关键,不然中文会变成 Unicode 编码;indent=2让输出有缩进,方便阅读,对吧?- dump ():直接把 Python 数据写入 JSON 文件
想把数据保存成 JSON 文件(比如配置文件、日志数据),用dump()更方便,不用先转字符串再写文件。
示例:
python
# 写入JSON文件with open("user.json", "w", encoding="utf-8") as f:json.dump(user, f, ensure_ascii=False, indent=2)打开生成的
user.json文件,里面的内容和上面的 JSON 字符串一样,是不是很简单?记住一定要加encoding="utf-8",不然可能会有编码问题。- loads ():把 JSON 字符串转成 Python 数据
从 API 接口拿到 JSON 格式的字符串,想用 Python 处理,用loads()转成字典或列表就行。
示例:
python
# 假设这是API返回的JSON字符串api_json = '{"code": 200, "data": {"name": "小红", "score": 95}}'# 转成Python字典data = json.loads(api_json)print(data["data"]["name"]) # 输出:小红print(data["code"]) # 输出:200转完之后就能像操作普通字典一样提取数据了,超方便。
- load ():直接读取 JSON 文件并转成 Python 数据
读取本地 JSON 文件里的数据,用load()一步到位,不用先读文件内容再解析。
示例:
python
# 读取刚才保存的user.json文件with open("user.json", "r", encoding="utf-8") as f:user_data = json.load(f)print(user_data["age"]) # 输出:18print(user_data["hobby"][0]) # 输出:篮球| 函数名 | 作用 | 适用场景 | 关键参数 |
|---|---|---|---|
| dumps() | Python→JSON 字符串 | 数据传输、字符串存储 | ensure_ascii=False(中文正常) |
| dump() | Python→JSON 文件 | 保存配置、本地存储 | indent=2(格式化输出) |
| loads() | JSON 字符串→Python | 解析 API 返回数据 | 无,直接传字符串 |
| load() | JSON 文件→Python | 读取本地 JSON 数据 | encoding="utf-8"(避免乱码) |
三、实战案例:3 个高频场景,手把手教你用
光懂方法没用,结合实际场景练手才记得牢,这三个场景几乎每天都会用到,代码直接抄着用。
- 案例 1:生成带嵌套结构的 JSON 配置文件
程序配置文件常需要嵌套结构,比如数据库配置、用户设置,用dump()轻松搞定。
python
# 定义带嵌套的配置数据config = {"app_name": "数据处理工具","version": "1.0.0","database": {"host": "localhost","port": 3306,"user": "root","password": "123456"},"log": {"level": "info","path": "./logs/","enabled": True}}# 写入配置文件with open("config.json", "w", encoding="utf-8") as f:json.dump(config, f, ensure_ascii=False, indent=2)生成的配置文件结构清晰,后期修改也方便,比写在代码里灵活多了。
- 案例 2:解析 API 返回的嵌套 JSON 数据
调用 API 接口时,返回的数据往往有多层嵌套,用loads()解析后按层级提取就行。
python
# 模拟天气API返回的JSON数据weather_json = '''{"status": "success","data": {"city": "北京","today": {"temp": {"max": 28, "min": 18},"weather": "晴","wind": "南风3级"},"forecast": [{"date": "2023-10-01", "weather": "晴"},{"date": "2023-10-02", "weather": "多云"}]}}'''# 解析JSONweather_data = json.loads(weather_json)# 提取关键信息if weather_data["status"] == "success":city = weather_data["data"]["city"]max_temp = weather_data["data"]["today"]["temp"]["max"]tomorrow_weather = weather_data["data"]["forecast"][1]["weather"]print(f"{city}今天最高温度:{max_temp}℃,明天天气:{tomorrow_weather}")运行后会输出 “北京今天最高温度:28℃,明天天气:多云”,这样就轻松从嵌套 JSON 中提取到了需要的信息。
- 案例 3:批量处理 JSON 数据列表
处理多个用户、多条记录时,JSON 数组(列表)很常用,解析后用循环遍历就行。
python
# 模拟用户列表JSONusers_json = '''[{"id": 1, "name": "张三", "age": 20},{"id": 2, "name": "李四", "age": 22},{"id": 3, "name": "王五", "age": 19}]'''# 解析成Python列表users = json.loads(users_json)# 遍历处理for user in users:if user["age"] >= 20:print(f"用户{user['name']}已成年")这样就能批量处理列表中的 JSON 对象,统计、筛选数据都很方便。
四、常见错误解决:这 5 个坑别再踩了,兔子哥全帮你试过
- 中文显示成 Unicode 编码(如 \u5c0f\u660e)
错误现象:转 JSON 后中文变成"\u5c0f\u660e",看不清内容。
解决方法:dumps()或dump()时一定要加ensure_ascii=False,同时写文件时指定encoding="utf-8",这两个参数缺一不可,兔子哥当初漏了ensure_ascii,调试了半小时才找到原因。 - JSON 格式错误,提示 “Expecting property name enclosed in double quotes”
错误原因:键用了单引号或没加引号,比如{'name': '小明'}或{name: "小明"}。
解决方法:JSON 要求键必须用双引号,改成{"name": "小明"},Python 转 JSON 时会自动处理,但手动写 JSON 字符串要注意。 - 解析时提示 “KeyError”,找不到对应的键
错误原因:要么键名写错了(比如把 “name” 写成 “Name”,JSON 键名区分大小写),要么层级没取对(嵌套太深直接用了顶层键)。
解决方法:先打印解析后的 Python 数据,确认键名和层级,比如print(data)看看结构,再逐层提取。 - 写入文件时提示 “TypeError: Object of type xxx is not JSON serializable”
错误原因:Python 数据里有 JSON 不支持的类型,比如datetime日期对象、自定义类实例。
解决方法:把不支持的类型转成字符串或其他支持的类型,比如日期转成str(date_obj)。 - 列表或字典太大,转 JSON 时卡住
错误原因:数据量太大,dumps()一次性处理占用太多内存。
解决方法:如果数据太大,考虑用json.dump()直接写入文件(边写边处理),或者分块处理数据,别一次性转换。
五、自问自答:Python JSON 新手常问的 3 个问题
- “Python 字典和 JSON 长得差不多,为啥还要转来转去?”
因为字典是 Python 独有的 “方言”,其他语言(比如 JavaScript、Java)看不懂;而 JSON 是 “普通话”,所有编程语言都能解析。比如你用 Python 爬的数据,想给前端 JavaScript 用,必须转成 JSON 字符串才行。 - “JSON 里能存函数或类实例吗?”
不能哦!JSON 只支持字符串、数字、布尔值、数组、对象、null 这几种简单类型,像 Python 的函数、类、datetime 对象这些复杂类型,必须先转换成简单类型才能存,不然会报错 “not JSON serializable”。 - “处理超大 JSON 文件(几个 GB),内存不够怎么办?”
用json.load()一次性读入会占满内存,这时候可以用ijson这样的第三方库,它能按流的方式逐步解析 JSON,读一点解析一点,不会占用太多内存,适合处理大文件。
结尾心得
Python 操作 JSON 真的不难,关键是把
dumps dump loads load这四个函数用熟,再注意中文编码和格式细节。兔子哥的经验是,写代码时别着急,先想清楚数据流向:是 Python 转 JSON 还是 JSON 转 Python?是存字符串还是存文件?然后选对应的函数,加对参数。遇到报错别慌,看看错误提示,大部分都是格式错了或键名不对,打印一下数据结构很快就能找到问题。多动手写几个例子,比如生成配置文件、解析 API 数据,练两次就熟了,你会发现 JSON 处理其实是 Python 里超实用的技能!版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~