Python内置json模块:编码器和解码器详解
liuian 2025-09-04 11:53 21 浏览
知识图谱
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编程学习日志与技巧,敬请关注!
相关推荐
- office和visio安装顺序(office和visio怎么一起安装)
-
在某些情况下,安装Visio可能会发生与Office365冲突的问题。这是因为Visio和Office365具有不同的版本,可能会导致安装时出现错误或兼容性问题。为了避免这种冲突,...
- 电脑中病毒的原因(电脑中病毒正常吗)
-
电脑中毒的原因有以下几方面:1.网页被挂病毒。2.电脑裸奔,无防病毒软件。3.执行一些不安全的程序。4.U盘等不安全介质。5.电脑漏洞不及时补,被后台种毒。为了电脑不中病毒要注意以下几方面:1.更新系...
- 手机psd转换成jpg最简单方式
-
可以使用photoshop工具,方法如下:1、首先打开PS软件,然后选择自己需要的JPG格式的图片,在PS中打开。2、接下来先按快捷键“Ctrl+j”将图片复制出来,防止后面操作对原图片有损...
- win7提示激活码过期怎么办(win7激活已过期)
-
以win7为例,出现这样的问题原因分析:电脑的win7系统激活过又重新提示要激活的原因是因为微软对网络上的秘钥进行封杀所以导致我们激活无效。具体的解决方法:1、我们打开dos命令窗口,在创立中输入“s...
- 联想笔记本光驱驱动下载(联想电脑光驱驱动器在哪)
-
开机时进入BIOS,具体按什么牌子不同,按键也不同,开机有提示的,选择启动项,把光驱启动的顺序放到第一.按F10保存,重新启动就是光驱启动啦不需要设置光驱驱动,笔记本自带光驱驱动光驱是电脑的硬件设备,...
- win10装机必备实用软件(win10电脑装机必备软件)
-
1、office大部分的版本如office2007、office2000、office2011、office2013、office2016、office365等都支持win10。2、需要注意...
- 迅雷无法下载的链接用什么下载
-
1.可以使用其他下载工具代替迅雷。2.迅雷可能无法下载的原因有很多,比如网络问题、软件故障等。其他下载工具可以提供类似的功能,但可能具有更好的稳定性和兼容性。3.一些常见的替代迅雷的下载工具包括...
- apple官方网站(apple官方网站旗舰店)
-
1、首先打开浏览器,输入https://www.apple.com/;2、即可浏览苹果官网。 苹果公司(AppleInc.)是美国一家高科技公司。由史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗·韦恩(R...
- 哪些手机用鸿蒙系统(都什么手机能用鸿蒙系统)
-
截至目前,国内有以下几款手机品牌可以装鸿蒙系统:1.华为:华为Mate40系列、P40系列、Mate30系列、MatePadPro系列等。2.荣耀:荣耀V40、荣耀30系列、荣耀X10系列等...
- 手机u盘读不出来了怎么修复(手机u盘读取不出来)
-
1、手机不支持OTG功能,所以将U盘连接到手机后,手机无法识别U盘的内容,因此显示不了;这种情况只能换台支持OTG功能的手机来连接U盘才行。2、手机支持OTG功能,但是使用的OTG线质量有问题导致无法...
- 笔记本散热器买哪种好(笔记本散热器买哪种好贴吧)
-
散热器有十大品牌:九州风神、超频三,酷冷至尊Tt、AVC、思民、捷冷、安钛克Antec、安耐美Enermax、海盗船Corsair。能位列十大品牌,每一种的质量和功能都有保障。、目前网上销量最高的是九...
-
- 打印机驱动一直安装失败(打印机驱动一直安装失败怎么办)
-
打印机驱动程序安装失败需要对电脑进行其他设置,详细步骤如下:1,在电脑桌面上找到【计算机】并用鼠标右击。2,右击后在出现的选项中找到【管理】选项并点击打开。3,接下里会进入到计算机控制台界面,在这里要根据自己的电脑选择64位或者32位,选择...
-
2026-01-14 12:55 liuian
- ctrl加谁是截图(ctrl和什么键可以截图)
-
第一种:Ctrl+PrScrn使用这个组合键截屏,获得的是整个屏幕的图片第二种:Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片第三种:打开qq,使用快捷键Ctrl+...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- 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)
