《Python 中 JSON 的魔法秘籍:从入门到精通的进阶指南》

在当今数字化时代,网络编程无处不在,数据的高效传输与交互是其核心。JSON 作为一种轻量级的数据交换格式,凭借其简洁、易读、跨语言的特性,成为网络编程中数据传输与存储的关键技术。无论是前后端数据交互,还是不同系统间的信息共享,JSON 都扮演着重要角色。Python 作为广泛应用于网络编程的编程语言,熟练掌握 JSON 在 Python 中的使用方法,是开发者实现高效数据处理与交互的必备技能,能够显著提升网络应用的性能和稳定性。

JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在 Python 中,json模块提供了处理 JSON 数据的功能,使得 Python 程序可以方便地对数据进行序列化(将 Python 数据类型转换为 JSON 格式的字符串)和反序列化(将 JSON 格式的字符串转换回 Python 数据类型)。以下是 JSON 在 Python 中的详细使用方法:

序列化(编码)

  • json.dumps():将 Python 对象转换为 JSON 格式的字符串。支持的 Python 对象类型有字典、列表、元组、字符串、数字、布尔值和None,转换规则为:字典转换为 JSON 对象,列表和元组转换为 JSON 数组,字符串、数字、布尔值和None保持原有格式。
import jsondata = {"name": "Alice","age": 30,"hobbies": ["reading", "traveling"]
}
json_str = json.dumps(data)
print(json_str) 
  • json.dump():将 Python 对象序列化后写入到文件对象中。使用时需先打开文件,并指定合适的编码(通常为utf - 8),操作完成后文件会自动关闭(若使用with语句)。
import jsondata = [1, 2, 3, 4]
with open('data.json', 'w', encoding='utf - 8') as f:json.dump(data, f)

反序列化(解码)

  • json.loads():将 JSON 格式的字符串转换为 Python 对象。转换后的 Python 对象类型与原 JSON 数据结构对应,如 JSON 对象转换为 Python 字典,JSON 数组转换为 Python 列表。
import jsonjson_str = '{"name": "Bob", "age": 25, "is_student": false}'
data = json.loads(json_str)
print(data) 
  • json.load():从文件对象中读取 JSON 数据并反序列化为 Python 对象。同样,使用with语句打开文件,确保文件操作的安全性和规范性。
import jsonwith open('data.json', 'r', encoding='utf - 8') as f:data = json.load(f)print(data)

格式化输出

在使用json.dumps()时,可通过参数对输出的 JSON 字符串进行格式化,提高可读性。

  • indent参数:指定缩进的空格数,使 JSON 字符串按层级结构缩进显示。
import jsondata = {"person": {"name": "Charlie","details": {"age": 35,"city": "New York"}}
}
formatted_json = json.dumps(data, indent=4)
print(formatted_json)
  • separators参数:用于指定 JSON 字符串中项与项、键与值之间的分隔符。默认分隔符是, : ,可根据需求调整。
import jsondata = {"key1": "value1", "key2": "value2"}
custom_separators_json = json.dumps(data, separators=(',', ':'))
print(custom_separators_json) 

处理特殊数据类型

JSON 本身不支持所有 Python 数据类型,如日期时间、自定义类的实例等。处理这些特殊数据类型时,需要额外操作。

  • 日期时间类型:先将日期时间对象转换为字符串,再进行 JSON 序列化。
import json
from datetime import datetimenow = datetime.now()
now_str = now.strftime('%Y-%m-%d %H:%M:%S')
data = {"time": now_str}
json_data = json.dumps(data)
print(json_data) 
  • 自定义类的实例:通过继承json.JSONEncoder类,并重写default()方法,指定自定义类实例的序列化方式;反序列化时,利用object_hook参数传入自定义函数解析 JSON 数据为自定义类实例。
import jsonclass Point:def __init__(self, x, y):self.x = xself.y = yclass PointEncoder(json.JSONEncoder):def default(self, o):if isinstance(o, Point):return {'x': o.x, 'y': o.y}return super().default(o)def point_decoder(dct):if 'x' in dct and 'y' in dct:return Point(dct['x'], dct['y'])return dctpoint = Point(1, 2)
json_str = json.dumps(point, cls=PointEncoder)
loaded_point = json.loads(json_str, object_hook=point_decoder)
print(loaded_point.x, loaded_point.y) 

 json.dumps函数详解

函数定义

json.dumps 函数用于将 Python 对象编码成 JSON 格式的字符串,其参数及用途如下:

参数名含义类型默认值
obj要转换为 JSON 字符串的 Python 对象,如字典、列表等可序列化的 Python 对象

*这个表示在这个 仅限关键字 标记 * 之后的形参都必须以关键字参数形式传递该形参,不能是位置形参!仅限关键字参数*
skipkeys若为 True,当字典键不是基本类型(strintfloatboolNone)时跳过该键;为 False 时遇非基本类型键会抛 TypeError 异常布尔值False
ensure_ascii为 True 时,非 ASCII 字符转义为 \uXXXX 形式;为 False 时,非 ASCII 字符原样输出布尔值True
check_circular为 True 时检查对象是否有循环引用,有则抛 ValueError 异常;为 False 不检查,可能导致无限递归布尔值True
allow_nan为 True 时允许在 JSON 中使用 NaNInfinity 和 -Infinity;为 False 遇这些值抛 ValueError 异常布尔值True
cls自定义的 JSON 编码器类,用于处理特殊对象的序列化None
indent指定缩进的整数或字符串,使生成的 JSON 更易读。整数表示空格数,字符串(如 '\t')则用该字符串缩进整数或字符串None
separators元组 (item_separator, key_separator),指定 JSON 字符串中元素和键值对的分隔符元组(', ', ': ')
default处理无法直接序列化对象的函数,遇无法序列化对象时调用此函数函数None
sort_keys为 True 时,生成的 JSON 字符串中键按字典序排序布尔值False
**kw

**kw 是关键字参数,用于接收任意数量的额外关键字参数,它本质上是一个字典

它允许函数调用时接收显式定义外的关键字参数,并传递给自定义编码器类。在函数内,可通过 kw 字典访问这些参数,如调用 dumps 时传入 **{'a': 1, 'b': 2},就能用 kw['a'] 和 kw['b'] 获取值。

 

**kw 可扩展函数功能,开发者按需传入额外参数实现特殊处理,无需修改原参数列表;也能促进函数交互,在复杂程序中传递通用参数,增强代码灵活性与可维护性。

**kw相关使用示例

import jsondata = {'name': 'Alice', 'age': 30}
json_str = json.dumps(data, ensure_ascii=False, my_custom_param='value') 
# 这里的my_custom_param就是通过**kw传递的额外参数
print(json_str)

在上述示例中,my_custom_param 就是通过 **kw 传递的额外参数。虽然在标准的 json.dumps() 函数中,并没有定义 my_custom_param 这个参数,但通过 **kw 可以接收并在函数内部进行相应的处理。不过在标准库的 json.dumps() 函数中,并不会对自定义的 my_custom_param 做任何处理,只是将其作为 kw 字典的一个键值对保存下来。如果是自定义的 dumps 函数,可以在函数内部对 kw 中的参数进行相应的逻辑处理。

json.dumps完整使用示例

import json
from datetime import datetime# 自定义编码器处理日期对象
class CustomJSONEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime):return obj.strftime('%Y-%m-%d %H:%M:%S')return super().default(obj)# 定义一个包含多种类型数据的 Python 对象
data = {'name': '张三','age': 25,'is_student': True,'grades': [90, 85, 92],'birth_date': datetime(1999, 10, 15),('tuple_key',): '特殊键值'  # 非基本类型键
}# 使用 json.dumps 函数进行转换
try:json_str = json.dumps(data,skipkeys=True,  # 跳过非基本类型的键ensure_ascii=False,  # 不转义非 ASCII 字符check_circular=True,  # 检查循环引用allow_nan=True,  # 允许 NaN 等特殊值cls=CustomJSONEncoder,  # 使用自定义编码器indent=4,  # 缩进 4 个空格separators=(',', ':'),  # 设置分隔符default=None,  # 这里使用自定义编码器,可不设置 defaultsort_keys=True  # 按键排序)print(json_str)
except (TypeError, ValueError) as e:print(f"转换出错: {e}")

代码解释

  1. 自定义编码器 CustomJSONEncoder:继承自 json.JSONEncoder,重写 default 方法,处理 datetime 对象的序列化。
  2. 定义数据对象 data:包含字符串、整数、布尔值、列表、日期对象和非基本类型键。
  3. 调用 json.dumps 函数:设置多个参数进行转换,包括跳过非基本类型键、不转义非 ASCII 字符、使用自定义编码器等。
  4. 异常处理:捕获可能的 TypeError 和 ValueError 异常并输出错误信息。

json.loads详解

json.loads函数定义:

json.loads 函数用于将 JSON 格式的字符串解析为 Python 对象,以下是其各个形参的详细介绍:

形参类型描述默认值
sstr必需参数,包含 JSON 数据的字符串,loads 函数会将其解析为对应的 Python 对象。
*这个表示在这个 仅限关键字 标记 * 之后的形参都必须以关键字参数形式传递该形参,不能是位置形参!仅限关键字参数*
clsclass自定义的 JSON 解码器类。若提供该类,会使用此类进行 JSON 数据的解码操作。None
object_hookcallable当解析到 JSON 对象(字典)时调用的函数。此函数接收一个字典作为参数,并返回一个 Python 对象,可用于对解析后的字典进行自定义处理。None
parse_floatcallable用于解析 JSON 中浮点数的函数。解析到浮点数时会调用该函数,它接收一个字符串参数,并返回一个 Python 浮点数对象,可自定义浮点数的解析方式。None
parse_intcallable用于解析 JSON 中整数的函数。解析到整数时会调用该函数,它接收一个字符串参数,并返回一个 Python 整数对象,可自定义整数的解析方式。None
parse_constantcallable用于解析 JSON 中常量(如 NaNInfinity-Infinity)的函数。解析到这些常量时会调用该函数,它接收常量对应的字符串作为参数,并返回一个 Python 对象。None
object_pairs_hookcallable当解析到 JSON 对象(字典)时调用的函数,与 object_hook 不同的是,它接收一个由键值对元组组成的列表作为参数,常用于处理键重复的情况或需要保留键值对顺序的场景。None
**kw可变关键字参数接收其他额外的关键字参数,可传递给自定义的解码器类。 同json.dumps函数

json.loads 完整使用示例

import json
import math# 自定义解码器类
class CustomDecoder(json.JSONDecoder):def decode(self, s):result = super().decode(s)if isinstance(result, dict):for key, value in result.items():if isinstance(value, str):result[key] = value.upper()return result# 自定义对象钩子函数
def custom_object_hook(dct):if 'name' in dct:dct['greeting'] = f"HELLO, {dct['name']}!"return dct# 自定义浮点数解析函数
def custom_parse_float(s):return float(s) * 2# 自定义常量解析函数
def custom_parse_constant(s):if s == 'NaN':return math.nanelif s == 'Infinity':return math.infelif s == '-Infinity':return -math.inf# 自定义对象对钩子函数
def custom_object_pairs_hook(pairs):result = {}for key, value in pairs:if key in result:result[key] = [result[key], value]else:result[key] = valuereturn result# 包含 JSON 数据的字符串
json_str = '{"name": "John", "price": 9.99, "value": NaN, "name": "Doe"}'# 使用 json.loads 进行解析
python_obj = json.loads(json_str,cls=CustomDecoder,object_hook=custom_object_hook,parse_float=custom_parse_float,parse_constant=custom_parse_constant,object_pairs_hook=custom_object_pairs_hook
)print(python_obj)

代码解释

  1. 自定义解码器类 CustomDecoder:对解析后的字典中的字符串值进行大写转换。
  2. 自定义对象钩子函数 custom_object_hook:当解析结果包含 name 键时,添加一个 greeting 键。
  3. 自定义浮点数解析函数 custom_parse_float:将解析到的浮点数乘以 2。
  4. 自定义常量解析函数 custom_parse_constant:处理 NaNInfinity 和 -Infinity 常量。
  5. 自定义对象对钩子函数 custom_object_pairs_hook:处理键重复的情况,将重复键的值合并为列表。
  6. 调用 json.loads:传入自定义的解码器类和各个钩子函数,对 JSON 字符串进行解析。

总结: 文章围绕 JSON 在 Python 中的使用展开。先是介绍了 JSON 的概念,以及在 Python 中json模块处理 JSON 数据的关键作用。接着从序列化和反序列化入手,讲解json.dumps()json.dump()json.loads()json.load()等函数的使用,还提及利用indentseparators参数对 JSON 字符串格式化输出。还针对 JSON 不支持的日期时间、自定义类实例等特殊数据类型,给出了相应的处理办法。  最后还从python源码的角度详细分析了json.dumps函数和json.loads函数的详细使用方法,包含各个形参的介绍和使用示例等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17435.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部门管理(体验,最原始方法来做,Django+mysql)

本人初学,写完代码在此记录和复盘 在创建和注册完APP之后(我的命名是employees),编写models.py文件创建表 手动插入了几条数据 1.部门查询 urls.py和views.py在编写之前,都要注意导入对应的库 urls.py:…

Docker的容器

Docker的容器 一.容器 容器是一种轻量级的虚拟化技术。它有效的将单个操作系统的资源划分到各独立的组中,以便更好的平衡这些独立的组之间资源的使用。 容器主要包含了命名空间(Namespaces)和cgroup(Control Groups…

[Redis] Redis分布式锁与常见面试题

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

Word 公式转 CSDN 插件 发布

经过几个月的苦修,这款插件终于面世了。 从Word复制公式到CSDN粘贴,总是出现公式中的文字被单独提出来,而公式作为一个图片被粘贴的情况。公式多了的时候还会导致CSDN禁止进一步的上传公式。 经过对CSDN公式的研究,发现在粘贴公…

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法: 可达性分析算法: 五种对象引用 软引用: 弱引用: 引用计数法和可达性分析法 引用计数法: 引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1&…

sqlilabs--小实验

一、先盲注判断 ?id1 and sleep(2)-- 如果发现页面存在注点,使用时间盲注脚本进行注入 import requestsdef inject_database(url):name for i in range(1, 20): # 假设数据库名称长度不超过20low 48 # 0high 122 # zmiddle (low high) // 2while low &l…

VMware Workstate 的 Ubuntu18 安装 vmware tools(不安装没法共享)

在共享主机路径后,可以在: /mnt/hgfs/下方找到共享的文件。但没有安装vmware tool时是没法共享的。 如何安装vmware tool,网上版本很多。这里记录一下: VMware Workstation 17 Pro,版本:17.6.0 虚拟机系统…

STM32 I2C通信协议说明

目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况: 异常情况: 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…

Unity与SVN集成:实现高效版本控制

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity与SVN集成:实现高效版本控制 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取&…

BUU37 [DASCTF X GFCTF 2024|四月开启第一局]web1234【代码审计/序列化/RCE】

Hint1&#xff1a;本题的 flag 不在环境变量中 Hint2&#xff1a;session_start&#xff08;&#xff09;&#xff0c;注意链子挖掘 题目&#xff1a; 扫描出来www.zip class.php <?phpclass Admin{public $Config;public function __construct($Config){//安全获取基…

历史性突破!DeepSeek双模型GitHub热度超OpenAI,展现中国AI力量

在2025年2月7日&#xff0c;中国AI领域传来了一则振奋人心的消息&#xff1a;DeepSeek旗下的两大开源项目在GitHub平台上实现了历史性突破&#xff0c;其Star数成功超越了OpenAI的明星项目。这一成就不仅标志着DeepSeek在技术研发和市场影响力上的重大飞跃&#xff0c;也为中国…

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…

畅聊deepseek-r1,SiliconFlow 硅基流动注册+使用

文章目录 SiliconFlow 硅基流动注册使用注册创建API密钥使用网页端使用代码调用api调用支持的模型 SiliconFlow 硅基流动注册使用 注册 硅基流动官网 https://cloud.siliconflow.cn/i/XcgtUixn 注册流程 切换中文 ​ 邀请码&#xff1a; XcgtUixn 创建API密钥 账户管理 --&g…

Java 大数据与区块链的融合:数据可信共享与溯源(45)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

初阶c语言(循环语句习题,完结)

前言&#xff1a; c语言为b站鹏哥&#xff0c;嗯对应视频37集 昨天做的c语言&#xff0c;今天在来做一遍&#xff0c;发现做错了 今天改了平均值的计算&#xff0c; 就是说最大值加上最小值&#xff0c;如果说这个数值非常大的话&#xff0c;两个值加上会超过int类型的最大…

传感器篇(一)——深度相机

目录 一 概要 二 原理 三 对比 四 产品 五 结论 一 概要 深度相机是一种能够获取物体深度信息的设备&#xff0c;相较于普通相机只能记录物体的二维图像信息&#xff0c;深度相机可以感知物体与相机之间的距离&#xff0c;从而提供三维空间信息。在你正在阅读的报告中提到…

蓝桥杯之并查集

算法思想 并查集是一种树形的数据结构&#xff0c;主要用于解决一些元素分组问题。用于处理一些不相交集合的合并以及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的树根&#xff0c;就能确…

Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程

系统版本&#xff1a;Windows 11 依赖环境&#xff1a;Anaconda3 运行软件&#xff1a;PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…

#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…