Python json 模块核心用法之字典 / 列表与 JSON 字符串互转的操作
作者:可可鸭~
在Python开发中,我们经常会遇到Python内置数据类型(字典、列表)和JSON字符串的相互转换需求——比如接口数据交互、配置文件读写、跨语言数据传递等场景,而Python内置的
json模块就是专门解决这个问题的工具,无需额外安装,直接导入即可使用。本文会通过实际代码案例,详细讲解
json模块的两个核心方法:json.dumps()(Python对象转JSON字符串)和json.loads()(JSON字符串转Python对象),同时对比新手易混淆的str()转换,以及讲解使用过程中的中文显示和常见报错问题,让你彻底掌握基础用法。
一、先明确两个核心概念
- Python对象:本文主要指字典(dict)和列表(list)(列表内嵌套字典是最常见的接口数据格式),是Python程序内部使用的数据类型。
- JSON字符串:符合JSON语法规范的字符串,是跨平台/跨语言的通用数据格式,语法要求键值对必须用双引号,而Python字典支持单/双引号,这是核心区别。
- json模块的核心作用:实现Python对象和JSON字符串的双向序列化/反序列化,而非简单的字符串转换。
二、核心方法1:json.dumps() —— Python对象转JSON字符串
json.dumps()的作用是将Python字典/列表序列化为标准JSON字符串,语法格式:
json.dumps(python_obj, ensure_ascii=False, indent=None, ...)
关键参数:ensure_ascii=False,默认值为True,若不设置,中文会被转成\uXXX格式的Unicode编码,设置后可正常显示中文,这是开发中必设的参数。
我们通过单个字典和字典嵌套列表两种最常见的场景,对比str()(简单字符串转换)和json.dumps()(标准JSON转换)的区别。
场景1:单个Python字典转字符串/JSON字符串
代码示例:
import json # 导入内置json模块,无需额外安装
# 定义一个Python字典对象
d = {
"name":"张三"
}
# 方式1:用str()做简单的字符串转换
print(str(d))
# 方式2:用json.dumps()转标准JSON字符串,设置ensure_ascii=False显示中文
s = json.dumps(d, ensure_ascii=False)
print(s)运行结果:
{'name': '张三'}
{"name": "张三"}
结果分析:
str(d):只是将Python字典直接转为普通字符串,保留了Python的语法特征——键值对用单引号,这并不是标准的JSON字符串,其他语言/工具无法识别。json.dumps(d, ensure_ascii=False):生成标准JSON字符串,键值对用双引号(符合JSON语法规范),且中文正常显示,是开发中的正确用法。
场景2:字典嵌套列表转字符串/JSON字符串
这是接口返回数据最常见的格式(多个对象的集合),代码示例:
# 定义一个Python列表,内部嵌套两个字典
d2 = [{
"name":"张三"
},{
"name":"旺旺"
}]
# 方式1:str()简单转换
print(str(d2))
# 方式2:json.dumps()转标准JSON字符串
ds = json.dumps(d2, ensure_ascii=False)
print(ds)
运行结果:
[{'name': '张三'}, {'name': '旺旺'}]
[{"name": "张三"}, {"name": "旺旺"}]
结果分析:
和单个字典的规律一致,str(d2)生成的是Python列表的字符串表示(单引号),而json.dumps()生成的是标准JSON数组字符串(双引号),可直接被前端、其他语言解析,这也是实际开发中唯一推荐的转换方式。
三、核心方法2:json.loads() —— JSON字符串转Python对象
json.loads()的作用是将标准JSON字符串反序列化为Python字典/列表,语法格式:
json.loads(json_str)
核心注意点:该方法仅接收JSON格式的字符串作为参数,不能直接传入Python字典/列表,否则会直接报错(新手最容易踩的坑)。
先看原代码的问题(新手必避坑)
原代码中这部分写法存在语法错误,运行后会直接抛出TypeError,我们先看错误代码:
# 错误示例:直接将Python字典/列表传入json.loads()
rp = {"name": "张三"} # 这是Python字典,不是JSON字符串
rpj = [{"name": "张三"}, {"name": "旺旺"}] # 这是Python列表,不是JSON字符串
res_dict = json.loads(rp) # 报错!参数不是字符串
res_list = json.loads(rpj) # 报错!参数不是字符串
报错原因:json.loads()的入参必须是字符串类型,而rp是字典、rpj是列表,类型不匹配,程序无法解析。
正确用法:先转JSON字符串,再反序列化
想要实现“Python对象→JSON字符串→Python对象”的完整流程,需先通过json.dumps()生成JSON字符串,再通过json.loads()转回Python对象,代码示例:
import json
# 1. 定义原始Python对象
rp = {"name": "张三"} # 字典
rpj = [{"name": "张三"}, {"name": "旺旺"}] # 列表嵌套字典
# 2. 先通过dumps()转为标准JSON字符串
rp_json = json.dumps(rp, ensure_ascii=False)
rpj_json = json.dumps(rpj, ensure_ascii=False)
print("JSON字符串rp_json:", rp_json, type(rp_json))
print("JSON字符串rpj_json:", rpj_json, type(rpj_json))
# 3. 再通过loads()转回Python对象
res_dict = json.loads(rp_json)
res_list = json.loads(rpj_json)
print("转回Python字典:", res_dict, type(res_dict))
print("转回Python列表:", res_list, type(res_list))运行结果:
JSON字符串rp_json: {"name": "张三"} <class 'str'>
JSON字符串rpj_json: [{"name": "张三"}, {"name": "旺旺"}] <class 'str'>
转回Python字典: {'name': '张三'} <class 'dict'>
转回Python列表: [{'name': '张三'}, {'name': '旺旺'}] <class 'list'>
结果分析:
json.dumps()将Python字典/列表转为str类型的JSON字符串;json.loads()根据JSON字符串的格式,自动还原为对应的Python类型——JSON对象→Python字典,JSON数组→Python列表。
四、本文核心知识点总结
- json模块的两个核心方法
json.dumps(python_obj, ensure_ascii=False):Python字典/列表 → 标准JSON字符串,ensure_ascii=False是中文正常显示的关键;json.loads(json_str):标准JSON字符串 → Python字典/列表,入参必须是字符串类型。
- str()和json.dumps()的本质区别
str():仅做简单的类型转换,保留Python语法特征(单引号),生成的不是标准JSON字符串;json.dumps():做序列化转换,生成符合JSON语法的字符串(双引号),可跨平台/跨语言解析。
- JSON和Python对象的语法差异
- JSON:键值对必须用双引号,数组/对象嵌套格式严格;
- Python字典/列表:键值对支持单/双引号,语法更灵活。
- 新手必避坑
json.loads()不能直接传入Python字典/列表,必须先通过json.dumps()转为JSON字符串;- 处理中文时,
json.dumps()必须加ensure_ascii=False,否则中文会被转成Unicode编码。
五、拓展使用场景
掌握基础用法后,可结合文件操作实现JSON配置文件的读写,这是实际开发中最常用的拓展场景:
import json
# 1. 将Python对象写入JSON文件
data = [{"name": "张三"}, {"name": "旺旺"}]
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4) # json.dump()直接写入文件,indent=4格式化缩进
# 2. 从JSON文件读取数据并转为Python对象
with open("data.json", "r", encoding="utf-8") as f:
res = json.load(f) # json.load()直接从文件读取并反序列化
print(res, type(res))注:json.dump()/json.load()是dumps()/loads()的文件版,直接实现Python对象与JSON文件的互转,无需手动做文件读写的字符串处理。

到此这篇关于Python json 模块核心用法详解:字典 / 列表与 JSON 字符串互转的文章就介绍到这了,更多相关Python json 字符串互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
