Python JSON 数据解析教程:从基础到高级
Python JSON 数据解析教程:从基础到高级
引言
在现代编程中,JSON(JavaScript Object Notation)已成为数据交换的标准格式。它以易于阅读和编写的文本格式存储和传输数据,广泛应用于Web API和配置文件中。Python提供了强大的内置库来处理JSON数据,使得解析和生成JSON变得简单高效。本文将深入探讨Python中的JSON数据解析,包括基础用法、高级技巧和实际案例,帮助你全面掌握这一重要技能。
什么是JSON?
JSON是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。JSON使用键值对的方式来表示数据,通常以对象({}
)和数组([]
)的形式出现。
JSON示例
以下是一个简单的JSON对象示例:
{"name": "Alice","age": 30,"is_student": false,"courses": ["Math", "Science"],"address": {"street": "123 Main St","city": "Anytown"}
}
在这个示例中,我们可以看到JSON对象包含了字符串、数字、布尔值、数组和嵌套对象。
Python中的JSON模块
Python的json
模块提供了简单的方法来处理JSON数据。我们可以使用json.loads()
将JSON字符串解析为Python对象,使用json.dumps()
将Python对象转换为JSON字符串。
导入JSON模块
在使用json
模块之前,我们需要先导入它:
import json
JSON数据解析的基本用法
1. 从JSON字符串解析为Python对象
使用json.loads()
函数可以将JSON字符串解析为Python对象。以下是一个简单的示例:
import json# JSON字符串
json_str = '{"name": "Alice", "age": 30, "is_student": false}'# 解析JSON字符串
data = json.loads(json_str)print(data)
print(data['name']) # 输出: Alice
2. 从Python对象转换为JSON字符串
使用json.dumps()
可以将Python对象转换为JSON字符串:
import json# Python字典
data = {"name": "Alice","age": 30,"is_student": False
}# 转换为JSON字符串
json_str = json.dumps(data)
print(json_str) # 输出: {"name": "Alice", "age": 30, "is_student": false}
3. 读取和写入JSON文件
在实际应用中,我们常常需要将JSON数据存储到文件中,或者从文件中读取JSON数据。可以使用json.load()
和json.dump()
函数来实现:
从文件读取JSON数据
import json# 读取JSON文件
with open('data.json', 'r') as file:data = json.load(file)print(data)
将Python对象写入JSON文件
import json# Python字典
data = {"name": "Alice","age": 30,"is_student": False
}# 写入JSON文件
with open('data.json', 'w') as file:json.dump(data, file)
JSON解析的高级用法
1. 处理复杂的JSON数据
在实际应用中,JSON数据可能会非常复杂,包含嵌套对象和数组。我们可以通过递归和循环来处理这些复杂的数据结构。
示例:解析嵌套JSON对象
import json# 复杂的JSON字符串
json_str = '''
{"name": "Alice","age": 30,"courses": [{"name": "Math","grade": "A"},{"name": "Science","grade": "B"}]
}
'''# 解析JSON字符串
data = json.loads(json_str)# 访问嵌套数据
for course in data['courses']:print(f"Course: {course['name']}, Grade: {course['grade']}")
2. 自定义JSON编码
在某些情况下,我们需要自定义如何将Python对象转换为JSON字符串。可以通过继承json.JSONEncoder
类来实现:
import json
from datetime import datetimeclass CustomEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime):return obj.isoformat() # 将日期时间对象转换为ISO格式return super().default(obj)# 使用自定义编码器
data = {"name": "Alice","timestamp": datetime.now()
}json_str = json.dumps(data, cls=CustomEncoder)
print(json_str)
3. 使用object_hook
参数解析JSON
在解析JSON时,我们可以使用object_hook
参数自定义如何将JSON对象转换为Python对象。例如,我们可以将JSON对象转换为自定义类的实例:
import jsonclass Person:def __init__(self, name, age):self.name = nameself.age = agedef custom_object_hook(dct):return Person(dct['name'], dct['age'])# JSON字符串
json_str = '{"name": "Alice", "age": 30}'# 解析JSON字符串并使用自定义对象钩子
person = json.loads(json_str, object_hook=custom_object_hook)
print(person.name) # 输出: Alice
print(person.age) # 输出: 30
实际案例:从API获取JSON数据
在实际应用中,处理JSON数据的一个常见场景是从Web API获取数据。以下是一个示例,演示如何从API获取JSON数据并进行解析:
示例:获取GitHub用户信息
import requests
import json# 发起HTTP GET请求
response = requests.get('https://api.github.com/users/octocat')# 解析JSON响应
data = response.json()# 打印用户信息
print(f"Username: {data['login']}")
print(f"Name: {data['name']}")
print(f"Public Repos: {data['public_repos']}")
在这个示例中,我们使用requests
库从GitHub API获取用户信息,并将响应解析为Python对象。
常见问题及解决方案
1. JSONDecodeError
在解析JSON字符串时,如果字符串格式不正确,可能会抛出JSONDecodeError
。确保你的JSON字符串符合标准格式,特别注意引号、逗号和括号的使用。
2. 处理Unicode字符
在JSON中,Unicode字符可能会导致编码问题。可以使用ensure_ascii=False
参数来确保正确处理Unicode字符:
data = {"message": "Hello, 世界"}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str) # 输出: {"message": "Hello, 世界"}
3. JSON与Python数据类型的映射
了解JSON和Python数据类型之间的映射关系是非常重要的:
- JSON对象对应Python字典(
dict
) - JSON数组对应Python列表(
list
) - JSON字符串对应Python字符串(
str
) - JSON数字对应Python整数(
int
)或浮点数(float
) - JSON布尔值对应Python布尔值(
True
或False
) - JSON
null
对应PythonNone
总结
通过本文的学习,你已经掌握了Python中JSON数据解析的基本用法和高级技巧。从简单的JSON字符串解析到复杂的嵌套对象处理,再到自定义编码和从API获取数据,Python的json
模块为我们提供了强大的功能。希望这篇文章能帮助你在实际项目中高效地处理JSON数据。
相关文章:
Python JSON 数据解析教程:从基础到高级
Python JSON 数据解析教程:从基础到高级 引言 在现代编程中,JSON(JavaScript Object Notation)已成为数据交换的标准格式。它以易于阅读和编写的文本格式存储和传输数据,广泛应用于Web API和配置文件中。Python提供了…...
25.UE5时间膨胀,慢动作,切换地图,刷BOSS
2-27 时间膨胀、慢动作、切换地图、刷BOSS_哔哩哔哩_bilibili 目录 1.刷新BOSS逻辑 2.时间膨胀实现慢动作 3.胜利画面,下一关 3.1胜利画面UI 3.2第一关、第二关游戏模式 3.3下一关按钮事件的绑定 1.刷新BOSS逻辑 实现当场上的怪物都死亡后,进行刷…...
Three.js 相机控制器Controls
在 3D 场景中,摄像机的控制尤为重要,因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器,最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…...
Android开发实战班 - 现代 UI 开发之自定义 Compose 组件
Jetpack Compose 不仅提供了丰富的内置组件,还允许开发者根据项目需求创建自定义组件。自定义 Compose 组件可以提高代码复用性、简化 UI 逻辑,并使应用界面更加一致和模块化。本章节将介绍如何创建自定义 Compose 组件,包括组件的创建、样式…...
All-in-one Notion 介绍
Notion 是一款集笔记、知识管理、任务规划和协作于一体的工具,它以高度的灵活性和可自定义的工作空间而闻名。它适合个人和团队使用,能够帮助用户高效管理生活、学习和工作。以下是 Notion 的一些主要特点: 1. 多功能工作区 Notion 将笔记、…...
深入理解C++11右值引用与移动语义:高效编程的基石
文章目录 前言📚一、C11的历史发展📖1.1 C11 之前的背景📖1.2 C11 的发展历程📖1.3 C11 的主要设计目标📖1.4 C11 的主要特性📖1.5 C11 的影响 📚二、统一的列表初始化📖2.1 基本列表…...
【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容
【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容 URBPARM_LCZ.TBL 文件的作用URBPARM_LCZ.TBL 文件中的参数URBPARM_LCZ.TBL 的使用URBPARM_LCZ.TBL 文件内容如何调整或扩展 URBPARM_LCZ.TBL参考URBPARM_LCZ.TBL 文件是 WRF(天气研究与预报模型) 中用于处理 局地气候区(Loca…...
网络是怎么连接的
目录 URL HTTP(超文本传输协议) FTP(文件传输协议) File mailto HTTP的方法 Socket URL URL(Uniform Resource Locator)中文名为统一资源定位符,它是互联网上用来标识某一资源的地址。就…...
Java 实现PDF添加水印
maven依赖: <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.3</version> </dependency>网络地址添加水印代码: public static boolean waterMarkNet(Stri…...
网络安全问题概述
1.1.计算机网络面临的安全性威胁 计算机网络上的通信面临以下的四种威胁: (1) 截获——从网络上窃听他人的通信内容。 (2) 中断——有意中断他人在网络上的通信。 (3) 篡改——故意篡改网络上传送的报文。可应用于域名重定向,即钓鱼网站。 (4) 伪造——伪…...
(udp)网络编程套接字Linux(整理)
源IP地址和目的IP地址 唐僧例子1 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址.思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上,但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进…...
Web应用安全入门:架构搭建、漏洞分析与HTTP数据包处理
Web应用安全入门:架构搭建、漏洞分析与HTTP数据包处理 引言 在当今数字化时代,Web应用已成为企业和个人在线交互的核心。然而,随着技术的发展,Web应用面临的安全挑战也日益增加。本文旨在为初学者提供一个关于Web应用架构搭建、…...
[JAVA]MyBatis框架—获取SqlSession对象
SqlSessionFactory作为MyBatis框架的核心接口有三大特性 SqlSessionFactory是MyBatis的核心对象 用于初始化MyBatis,创建SqlSession对象 保证SqlSessionFactory在应用中全局唯一 1.SqlSessionFactory是MyBatis的核心对象 假设我们要查询数据库的用户信息&#x…...
Perl 简介
Perl 简介 Perl 是一种高级、通用、解释型、动态编程语言。由 Larry Wall 于 1987 年首次发布,它结合了 C、sed、awk 和 shell 脚本语言的特性。Perl 最初被设计用于文本处理,如报告生成和文件转换,但随着时间的推移,它已经发展成…...
spring-bean的销毁流程
1 引入 在 Spring 框架中,Bean 的生命周期管理是其核心功能之一,而 Bean 的注销(Destruction)是生命周期的最后一步。无论是关闭数据库连接、释放线程资源,还是执行缓存持久化操作,合适的销毁策略都至关重…...
问:Spring MVC DispatcherServlet流程步骤梳理
DispatcherServlet是Spring MVC框架中的核心组件,负责接收客户端请求并将其分发到相应的控制器进行处理。作为前端控制器(Front Controller)的实现,DispatcherServlet在整个请求处理流程中扮演着至关重要的角色。本文将探讨Dispat…...
用源码编译虚幻引擎,并打包到安卓平台
用源码编译虚幻引擎,并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目,简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定,然后加入 Epic 邀请的组织,…...
快速搭建Android开发环境:Docker部署docker-android并实现远程连接
目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…...
「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成
本篇将系统介绍Cangjie编程语言中程序的基本组成部分,涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则,帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…...
【Linux网络编程】简单的UDP套接字
目录 一,socket编程的相关说明 1-1,sockaddr结构体 1-2,Socket API 二,基于Udp协议的简单通信 三,UDP套接字的应用 3-1,实现英译汉字典 一,socket编程的相关说明 Socket编程是一种网络通信…...
在Vue中使用Excalidraw实现在线画板
概述 Excalidraw是一个非常好用的画图板工具,但是是用React写的,本文分享一种在Vue项目中使用的方法。 效果 实现 Excalidraw简介 这篇文章(Excalidraw 完美的绘图工具:https://zhuanlan.zhihu.com/p/684940131)介绍的很全面,…...
游戏+AI的发展历程,AI技术在游戏行业的应用有哪些?
人工智能(AI)与游戏的结合,不仅是技术进步的体现,更是人类智慧的延伸。从最初的简单规则到如今的复杂决策系统,AI在游戏领域的发展历史可谓波澜壮阔。 早在2001年,就有研究指出游戏人工智能领域࿰…...
Methode Electronics EDI 需求分析
Methode Electronics 是一家总部位于美国的全球性技术公司,专注于设计和制造用于多个行业的电子和电气组件,产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域,提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…...
2023AE软件、Adobe After Effects安装步骤分享教程
2023AE软件是一款由Adobe公司开发的视频编辑软件,也被称为Adobe After Effects。它在广告、电影、电视和网络视频等领域广泛应用,用于制作动态图形、特效、合成和其他视觉效果。该软件支持多种视频和音频文件格式,具有丰富的插件和预设&#…...
【前端】JavaScript 变量引用、内存与数组赋值:深入解析三种情景
博客主页: [小ᶻZ࿆] 本文专栏: 前端 文章目录 💯前言💯场景一:直接赋值与重新引用为什么结果不是 [3, 4, 5]?1. 引用与赋值的基本概念2. 图示分析 关键总结 💯场景二:引用指向的变化为什么…...
本地项目运行提示跨域问题
项目背景:我使用phpwebstudy在本地搭建了一个项目,然后前端是http://localhost:8080/ 后端我直接创建了一个本地域名,例如www.abc.com 然后vue.config.js配置如下,这个配置在我所有线上环境是没有任何问题的 devServer: {proxy…...
C++ —— string类(上)
目录 string的介绍 string类功能的使用介绍 constructor —— 构造 介绍使用(1)(2)(4) :构造、拷贝构造、带参构造 介绍(3):拷贝string类对象的一部分字符…...
React Native Mac 环境搭建
下载 Mac 版Android Studio 下载 安装 JDK 环境 Flutter 项目实战-环境变量配置一 安装 Node.js 方式一 通过Node.js 官网下载 下载完成后点击安装包进行安装 安装完成...
Python Web 开发的路径管理艺术:FastAPI 项目中的最佳实践与问题解析20241119
Python Web 开发的路径管理艺术:FastAPI 项目中的最佳实践与问题解析 引言:从路径错误到模块化管理的技术旅程 在现代 Python Web 开发中,路径管理是一个常常被忽视却非常重要的问题。尤其是在使用像 FastAPI 和 Tortoise ORM 这样的框架时…...
Rust derive macro(Rust #[derive])Rust派生宏
参考文章:附录 D:派生特征 trait 文章目录 Rust 中的派生宏 #[derive]基础使用示例:派生 Debug 派生其他常用特征示例:派生 Clone 和 Copy 派生宏的限制和自定义派生自定义派生宏上面代码运行时报错了,以下是解释 结论…...
一步一步网站建设教程/百度怎么做广告推广
http://www.hcharts.cn/转载于:https://www.cnblogs.com/missmiao/p/4772786.html...
wordpress 付费下载插件/网络推广一个月工资多少
CentOS 7.x 虚拟机静态网络配置 修改主机名: hostnamectl set-hostname 主机名更改前: vim /etc/sysconfig/network-scripts/ifcfg-ens33更改后: TYPE“Ethernet” PROXY_METHOD“none” BROWSER_ONLY“no” BOOTPROTO“static” DEFROU…...
做网站前台用什么软件/百度文库登录入口
第1关:柱状图 - 商品房销售价格统计图 本关任务:请编写代码绘制办公楼商品房平均销售价格柱状图。 # 请编写代码绘制住宅商品房平均销售价格柱状图import matplotlib matplotlib.use("Agg")# 请在此添加实现代码 # # ********** Begin *********# import matpl…...
开了外网网站打不开/百度网址大全下载安装
16/32位基本寄存器##段寄存器的使用指令指针寄存器和标志寄存器标志寄存器(FLAGS):用于存放系统的状态标志和控制标志。状态标志:是CPU在执行指令的过程中产生的。有的指令影响状态标志,有的不影响,还有的指令与当前状态标志有关。标志寄存器…...
app制作平台源码/网络优化公司有哪些
SQL分类: DDL:操作数据库和表DML:增删改表中数据DQL:查询表中数据DCL:管理用户,授权 DBA:数据库管理员 1. 管理用户 -- 1.添加用户: 语法:CREATE USER 用户名主机名 ID…...
深圳做微信网站制作/百度网盘怎么找片
①打开pcb文件,选择设计--层叠管理器 ②进入下图 然后选择左下角的Impedance,点击add增加阻抗计算 ③以单端50欧姆为例 选中阻抗会出现详细设置计算...