Python内置json模块:编码器和解码器详解
liuian 2025-09-04 11:53 17 浏览
知识图谱
1. JSON简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但JSON是完全独立于语言的文本格式。
1.1 JSON的特点
- 轻量级:JSON的数据格式简洁,相比于XML等数据格式,JSON更加轻量。
- 易读性:JSON的数据格式清晰,易于人阅读和理解。
- 易解析:JSON的数据格式简单,易于机器解析和生成。
- 语言无关:JSON是完全独立于语言的文本格式,几乎所有编程语言都支持JSON。
1.2 JSON的应用场景
- 数据交换:JSON常用于Web应用中的数据交换,如前后端数据交互。
- 配置文件:JSON也常用于配置文件,如Node.js中的配置文件。
- API接口:JSON是RESTful API中最常用的数据格式。
2. Python中的json模块
Python的json模块提供了将Python对象编码为JSON格式的字符串,以及将JSON格式的字符串解码为Python对象的功能。
2.1 json模块的主要功能
- 编码:将Python对象转换为JSON格式的字符串。
- 解码:将JSON格式的字符串转换为Python对象。
2.2 json模块的常用函数
2.2.1 json.dumps()
功能:将Python对象编码为JSON格式的字符串。
原型:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数:
- obj:要序列化的Python对象。
- skipkeys:如果为True,则跳过非基本类型的键。
- ensure_ascii:如果为True,则输出保证对所有输入的非ASCII字符进行转义。
- check_circular:如果为False,则跳过容器类型的循环引用检查。
- allow_nan:如果为False,则对超范围的float值进行序列化将导致ValueError。
- cls:自定义JSON编码器类。
- indent:缩进级别,用于美化输出。
- separators:分隔符元组,用于控制输出格式。
- default:当对象无法被序列化时调用的函数。
- sort_keys:如果为True,则字典输出将按键排序。
返回值:JSON格式的字符串。
示例:
import json
data = {'name': 'Alice', 'age': 25, 'city': 'New York'}
json_str = json.dumps(data, indent=4)
print(json_str)
2.2.2 json.dump()
功能:将Python对象序列化为JSON格式的字符串,并写入文件。
原型:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数:
- obj:要序列化的Python对象。
- fp:文件型对象,用于写入JSON数据。
- 其他参数与json.dumps()相同。
返回值:无。
示例:
import json
data = {'name': 'Alice', 'age': 25, 'city': 'New York'}
with open('data.json', 'w') as f:
json.dump(data, f, indent=4)
2.2.3 json.loads()
功能:将JSON格式的字符串解码为Python对象。
原型:
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数:
- s:包含JSON数据的字符串。
- cls:自定义JSON解码器类。
- object_hook:当解码JSON对象时调用的函数。
- parse_float:当解码JSON浮点数时调用的函数。
- parse_int:当解码JSON整数时调用的函数。
- parse_constant:当解码JSON常量时调用的函数。
- object_pairs_hook:当解码JSON对象字面值时调用的函数。
- 其他参数与json.load()相同。
返回值:Python对象。
示例:
import json
json_str = '{"name": "Alice", "age": 25, "city": "New York"}'
data = json.loads(json_str)
print(data)
2.2.4 json.load()
功能:将JSON格式的字符串从文件中读取并解码为Python对象。
原型:
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数:
- fp:包含JSON数据的文件型对象。
- 其他参数与json.loads()相同。
返回值:Python对象。
示例:
import json
with open('data.json', 'r') as f:
data = json.load(f)
print(data)
3. JSON编码器和解码器
3.1 json.JSONEncoder
功能:用于Python数据结构的可扩展JSON编码器。
原型:
class json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
参数:
- skipkeys:如果为False,则当尝试对非基本类型的键进行编码时将会引发TypeError。
- ensure_ascii:如果为True,则输出保证将所有输入的非ASCII字符转义。
- check_circular:如果为True,则列表、字典和自定义的已编码对象将在编码期间进行循环引用检查。
- allow_nan:如果为True,则编码NaN、Infinity和-Infinity。
- sort_keys:如果为True,则字典的输出是按照键排序。
- indent:如果是一个非负整数或者字符串,那么JSON数组元素和对象成员会被美化输出为该值指定的缩进等级。
- separators:如果指定,应该是一个(item_separator, key_separator)元组。
- default:如果指定,其应该是一个函数,每当某个对象无法被序列化时它会被调用。
方法:
- default(o):在子类中实现这种方法使其返回o的可序列化对象,或者调用基础实现(引发TypeError)。
- encode(o):返回Python o数据结构的JSON字符串表达方式。
- iterencode(o):编码给定对象o,并且让每个可用的字符串表达方式。
示例:
import json
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, complex):
return {'__complex__': True, 'real': obj.real, 'imag': obj.imag}
return super().default(obj)
data = 1 + 2j
json_str = json.dumps(data, cls=ComplexEncoder)
print(json_str)
3.2 json.JSONDecoder
功能:简单的JSON解码器。
原型:
class json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
参数:
- object_hook:当解码JSON对象时调用的函数。
- parse_float:当解码JSON浮点数时调用的函数。
- parse_int:当解码JSON整数时调用的函数。
- parse_constant:当解码JSON常量时调用的函数。
- strict:如果为False,则控制字符将被允许在字符串内。
- object_pairs_hook:当解码JSON对象字面值时调用的函数。
方法:
- decode(s):返回s的Python表示形式。
- raw_decode(s):从s中解码出JSON文档,并返回一个Python表示形式为2元组以及指明该文档在s中结束位置的序号。
示例:
import json
def as_complex(dct):
if '__complex__' in dct:
return complex(dct['real'], dct['imag'])
return dct
json_str = '{"__complex__": true, "real": 1, "imag": 2}'
data = json.loads(json_str, object_hook=as_complex)
print(data)
4. 异常处理
4.1 json.JSONDecodeError
功能:拥有以下附加属性的ValueError的子类。
属性:
- msg:未格式化的错误消息。
- doc:正在解析的JSON文档。
- pos:解析失败的开始索引。
- lineno:对应于pos的行。
- colno:对应于pos的列。
示例:
import json
try:
json.loads('{"name": "Alice", "age": 25, "city": "New York"')
except json.JSONDecodeError as e:
print(f"JSON解码错误: {e.msg}")
print(f"错误位置: {e.pos}")
print(f"错误行: {e.lineno}")
print(f"错误列: {e.colno}")
5. 应用案例
5.1 案例1:配置文件读取与写入示例
场景:使用JSON格式存储配置文件,并在程序中读取和写入配置。
代码:
import json
# 配置文件路径
config_file = 'config.json'
# 默认配置
default_config = {
'host': 'localhost',
'port': 8080,
'debug': True
}
# 读取配置文件
def read_config():
try:
with open(config_file, 'r') as f:
return json.load(f)
except FileNotFoundError:
return default_config
# 写入配置文件
def write_config(config):
with open(config_file, 'w') as f:
json.dump(config, f, indent=4)
# 示例
config = read_config()
print("当前配置:", config)
# 修改配置
config['port'] = 9090
write_config(config)
print("更新后的配置已写入文件")
5.2 案例2:复杂对象的JSON序列化示例
场景:将包含复杂对象(如自定义类实例)的数据结构序列化为JSON字符串。
代码:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
return super().default(obj)
# 创建Person实例
person = Person('Alice', 25)
# 序列化为JSON字符串
json_str = json.dumps(person, cls=PersonEncoder, indent=4)
print(json_str)
# 反序列化
def person_decoder(dct):
if 'name' in dct and 'age' in dct:
return Person(dct['name'], dct['age'])
return dct
person_data = json.loads(json_str, object_hook=person_decoder)
print(f"反序列化后的Person对象: name={person_data.name}, age={person_data.age}")
6. 学习结
6.1 学习路线
- 了解JSON的基本概念和应用场景。
- 掌握Python中json模块的基本用法,包括json.dumps()、json.dump()、json.loads()和json.load()。
- 学习JSON编码器和解码器的使用,包括json.JSONEncoder和json.JSONDecoder。
- 掌握异常处理,特别是json.JSONDecodeError的使用。
- 通过实际案例,如配置文件读取与写入、复杂对象的JSON序列化等,巩固所学知识。
6.2 学习总结
通过本教程,我们详细介绍了Python内置模块json的使用方法,包括JSON的基本概念、json模块的主要功能、JSON编码器和解码器的使用、异常处理以及实际应用案例。希望本教程能帮助你更好地理解和使用Python中的JSON处理功能。
持续更新Python编程学习日志与技巧,敬请关注!
相关推荐
- 搭建一个20人的办公网络(适用于20多人的小型办公网络环境)
-
楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...
- 笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)
-
1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...
- 汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)
-
使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...
- xpsp3安装版系统下载(windowsxpsp3安装教程)
-
xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...
- 没有备份的手机数据怎么恢复
-
手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。 2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。 3、...
- 电脑怎么激活windows11专业版
-
win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...
- 华为手机助手下载官网(华为手机助手app下载专区)
-
华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...
- 光纤线断了怎么接(宽带光纤线断了怎么接)
-
宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...
- win7旗舰版和专业版区别(win7旗舰版跟专业版)
-
1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...
- 万能连接钥匙(万能wifi连接钥匙下载)
-
1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...
- 雨林木风音乐叫什么(雨林木风是啥)
-
雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...
- aics6序列号永久序列号(aics6破解序列号)
-
关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...
- 手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)
-
答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
