一、核心模块:json
Python 内置 json 模块专门处理 JSON 与 Python 对象互转,**json.loads()** 负责:JSON字符串 → Python字典/列表。
核心方法区分
json.loads(json_str):字符串 → Python 对象(字典/列表)json.load(file):JSON文件 → Python 对象json.dumps(dict):字典 → JSON字符串(反向操作)
二、基础语法
import json
# json_str:标准格式JSON字符串
python_dict = json.loads(json_str)
三、示例1:单层JSON对象(最常用)
JSON字符串格式要求
import json
# 标准JSON字符串(双引号包裹键和值)
json_str = '{"name":"张三","age":22,"gender":"男","is_student":true,"score":95.5}'
# JSON字符串转字典
data_dict = json.loads(json_str)
print("转换后的类型:", type(data_dict))
print("完整字典:", data_dict)
print("取值name:", data_dict["name"])
print("取值age:", data_dict["age"])
print("布尔值:", data_dict["is_student"])
输出结果
转换后的类型: <class 'dict'>
完整字典: {'name': '张三', 'age': 22, 'gender': '男', 'is_student': True, 'score': 95.5}
取值name: 张三
取值age: 22
布尔值: True
类型映射规则(JSON → Python)
四、示例2:JSON数组(数组字符串转列表,列表内含字典)
JSON 顶层是 [] 数组,转换后得到 list,列表元素为字典:
import json
# JSON数组字符串
json_arr_str = '''
[
{"id": 1, "book": "Python入门"},
{"id": 2, "book": "MySQL教程"},
{"id": 3, "book": "前端开发"}
]
'''
data_list = json.loads(json_arr_str)
print("类型:", type(data_list))
print("全部数据:", data_list)
# 取第二个字典的书名
print(data_list[1]["book"])
输出:
类型: <class 'list'>
全部数据: [{'id': 1, 'book': 'Python入门'}, {'id': 2, 'book': 'MySQL教程'}, {'id': 3, 'book': '前端开发'}]
MySQL教程
五、示例3:嵌套复杂JSON(多层字典/数组)
接口返回的真实JSON大多多层嵌套:
import json
complex_json = '''
{
"code": 200,
"msg": "请求成功",
"data": {
"user_info": {
"uid": 10001,
"username": "lisi",
"hobbies": ["篮球", "编程", "旅行"]
},
"article_list": [
{"title": "JSON解析教程", "read": 1200},
{"title": "Python基础", "read": 3500}
]
}
}
'''
res_dict = json.loads(complex_json)
# 多层取值
print("状态码:", res_dict["code"])
print("用户名:", res_dict["data"]["user_info"]["username"])
print("第二个爱好:", res_dict["data"]["user_info"]["hobbies"][1])
print("第一篇文章标题:", res_dict["data"]["article_list"][0]["title"])
输出:
状态码: 200
用户名: lisi
第二个爱好: 编程
第一篇文章标题: JSON解析教程
六、常见报错与避坑重点
坑1:JSON使用单引号( loads 直接报错)
错误写法(Python字典字符串≠JSON):
import json
# 键是单引号,非法JSON
wrong_str = "{'name':'小明'}"
json.loads(wrong_str) # 抛 json.JSONDecodeError
解决:
- 如果本地只有单引号字符串,先用
eval()(不安全,不推荐)或替换引号:
wrong_str = "{'name':'小明'}"
fix_str = wrong_str.replace("'", '"')
d = json.loads(fix_str)
print(d)
坑2:JSON末尾多余逗号
# 最后一个键值对后有逗号,解析失败
error_json = '{"a":1,"b":2,}'
json.loads(error_json) # 报错
坑3:JSON带注释
标准JSON不支持 //、/* */ 注释,带注释直接解析报错。
坑4:中文乱码/转义字符
接口返回带 \uXXXX 中文转义,loads 自动还原中文,无需额外处理:
import json
escape_json = '{"title":"\u4e2d\u6587\u6d4b\u8bd5"}'
d = json.loads(escape_json)
print(d["title"]) # 输出:中文测试
七、拓展:loads 可选参数
1. object_hook:自定义字典转换
解析时对每个字典执行自定义函数:
import json
defconvert_user(d):
# 给用户对象新增字段
if"uid"in d:
d["is_vip"] = False
return d
json_str = '{"uid": 1001, "name": "王五"}'
data = json.loads(json_str, object_hook=convert_user)
print(data) # {'uid': 1001, 'name': '王五', 'is_vip': False}
2. parse_constant:处理特殊常量(NaN/Infinity)
标准JSON不支持NaN,如需解析添加参数:
import json
defhandle_constant(val):
if val == "NaN":
return0.0
return val
s = '{"num": NaN}'
d = json.loads(s, parse_constant=handle_constant)
print(d)
八、反向操作:字典转回JSON字符串(配套使用)
日常经常来回转换,补充对照:
import json
d = {"name": "小赵", "age": 25, "tags": ["技术", "阅读"]}
# 字典转JSON字符串
json_s = json.dumps(d, ensure_ascii=False, indent=2)
print(json_s)
参数说明:
ensure_ascii=False:中文不转义,正常显示
九、实战场景:接口返回数据解析(模拟requests)
import json
# 模拟网络请求返回的json字符串
response_json = '''
{
"status": 1,
"data": {
"token": "abc123xyz",
"expire": 7200
}
}
'''
# 解析为字典
resp = json.loads(response_json)
# 业务逻辑取值
if resp["status"] == 1:
token = resp["data"]["token"]
print("获取token:", token)
十、总结流程
- 使用
data = json.loads(json字符串) 转为字典/列表
需要我给你一份可直接复制的JSON解析异常捕获完整模板(包含try-except捕获解析错误)吗?