Python json 模块核心用法详解:字典 / 列表与 JSON 字符串互转

在Python开发中,我们经常会遇到Python内置数据类型(字典、列表)JSON字符串 的相互转换需求------比如接口数据交互、配置文件读写、跨语言数据传递等场景,而Python内置的json模块就是专门解决这个问题的工具,无需额外安装,直接导入即可使用。

本文会通过实际代码案例,详细讲解json模块的两个核心方法:json.dumps()(Python对象转JSON字符串)和json.loads()(JSON字符串转Python对象),同时对比新手易混淆的str()转换,以及讲解使用过程中的中文显示常见报错问题,让你彻底掌握基础用法。

一、先明确两个核心概念

  1. Python对象 :本文主要指字典(dict)列表(list)(列表内嵌套字典是最常见的接口数据格式),是Python程序内部使用的数据类型。

  2. JSON字符串 :符合JSON语法规范的字符串,是跨平台/跨语言的通用数据格式,语法要求键值对必须用双引号,而Python字典支持单/双引号,这是核心区别。

  3. json模块的核心作用 :实现Python对象和JSON字符串的双向序列化/反序列化,而非简单的字符串转换。

二、核心方法1:json.dumps() ------ Python对象转JSON字符串

json.dumps()的作用是将Python字典/列表 序列化为标准JSON字符串,语法格式:

python 复制代码
json.dumps(python_obj, ensure_ascii=False, indent=None, ...)

关键参数ensure_ascii=False,默认值为True,若不设置,中文会被转成\uXXX格式的Unicode编码,设置后可正常显示中文,这是开发中必设的参数。

我们通过单个字典字典嵌套列表 两种最常见的场景,对比str()(简单字符串转换)和json.dumps()(标准JSON转换)的区别。

场景1:单个Python字典转字符串/JSON字符串

代码示例:

python 复制代码
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)

运行结果

plain 复制代码
{'name': '张三'}
{"name": "张三"}

结果分析

  1. str(d):只是将Python字典直接转为普通字符串 ,保留了Python的语法特征------键值对用单引号,这并不是标准的JSON字符串,其他语言/工具无法识别。

  2. json.dumps(d, ensure_ascii=False):生成标准JSON字符串 ,键值对用双引号(符合JSON语法规范),且中文正常显示,是开发中的正确用法。

场景2:字典嵌套列表转字符串/JSON字符串

这是接口返回数据最常见的格式(多个对象的集合),代码示例:

python 复制代码
# 定义一个Python列表,内部嵌套两个字典
d2 = [{
    "name":"张三"
},{
    "name":"旺旺"
}]
# 方式1:str()简单转换
print(str(d2))
# 方式2:json.dumps()转标准JSON字符串
ds = json.dumps(d2, ensure_ascii=False)
print(ds)

运行结果

plain 复制代码
[{'name': '张三'}, {'name': '旺旺'}]
[{"name": "张三"}, {"name": "旺旺"}]

结果分析

和单个字典的规律一致,str(d2)生成的是Python列表的字符串表示(单引号),而json.dumps()生成的是标准JSON数组字符串(双引号),可直接被前端、其他语言解析,这也是实际开发中唯一推荐的转换方式。

三、核心方法2:json.loads() ------ JSON字符串转Python对象

json.loads()的作用是将标准JSON字符串 反序列化为Python字典/列表,语法格式:

python 复制代码
json.loads(json_str)

核心注意点 :该方法仅接收JSON格式的字符串作为参数,不能直接传入Python字典/列表,否则会直接报错(新手最容易踩的坑)。

先看原代码的问题(新手必避坑)

原代码中这部分写法存在语法错误 ,运行后会直接抛出TypeError,我们先看错误代码:

python 复制代码
# 错误示例:直接将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对象,代码示例:

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))

运行结果

plain 复制代码
JSON字符串rp_json: {"name": "张三"} <class 'str'>
JSON字符串rpj_json: [{"name": "张三"}, {"name": "旺旺"}] <class 'str'>
转回Python字典: {'name': '张三'} <class 'dict'>
转回Python列表: [{'name': '张三'}, {'name': '旺旺'}] <class 'list'>

结果分析

  1. json.dumps()将Python字典/列表转为str类型的JSON字符串;

  2. json.loads()根据JSON字符串的格式,自动还原为对应的Python类型------JSON对象→Python字典,JSON数组→Python列表。

四、本文核心知识点总结

  1. json模块的两个核心方法

    • json.dumps(python_obj, ensure_ascii=False):Python字典/列表 → 标准JSON字符串,ensure_ascii=False是中文正常显示的关键;

    • json.loads(json_str):标准JSON字符串 → Python字典/列表,入参必须是字符串类型

  2. str()和json.dumps()的本质区别

    • str():仅做简单的类型转换,保留Python语法特征(单引号),生成的不是标准JSON字符串;

    • json.dumps():做序列化转换,生成符合JSON语法的字符串(双引号),可跨平台/跨语言解析。

  3. JSON和Python对象的语法差异

    • JSON:键值对必须用双引号,数组/对象嵌套格式严格;

    • Python字典/列表:键值对支持单/双引号,语法更灵活。

  4. 新手必避坑

    • json.loads()不能直接传入Python字典/列表 ,必须先通过json.dumps()转为JSON字符串;

    • 处理中文时,json.dumps()必须加ensure_ascii=False,否则中文会被转成Unicode编码。

五、拓展使用场景

掌握基础用法后,可结合文件操作实现JSON配置文件的读写,这是实际开发中最常用的拓展场景:

python 复制代码
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文件的互转,无需手动做文件读写的字符串处理。

相关推荐
寻寻觅觅☆6 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
YJlio7 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
l1t7 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿7 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar1238 小时前
C++使用format
开发语言·c++·算法
山塘小鱼儿8 小时前
本地Ollama+Agent+LangGraph+LangSmith运行
python·langchain·ollama·langgraph·langsimth
码说AI8 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS8 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子8 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言