在 Python 中使用 JSON

news2024/12/26 10:56:05

了解如何在 Python 中使用 JSON,从基础到高级技术。本指南涵盖解析、序列化、API 集成和最佳实践。

1. JSON 简介

1.1. 什么是 JSON?

JSON(JavaScript 对象表示法)是一种轻量级数据交换格式,人类可以轻松读取和写入,机器也可以轻松解析和生成。虽然 JSON 源自 JavaScript,但它与语言无关,并且受到许多编程语言(包括 Python)的支持。

1.2. 为什么使用 JSON?

JSON 因其简单易读而成为 Web 数据交换的事实标准。无论使用 Web API还是在应用程序之间交换数据,JSON 通常都是首选格式。

在gis领域,基于json的基础上,开发出了geojson格式。

1.3. JSON 与其他数据格式

  • JSON 与 XML:与更为冗长的 XML 相比,JSON 更简洁且更易于使用。

  • JSON 与 YAML:YAML 通常被认为更易于人类阅读,但与 JSON 相比更容易出现解析错误。

2.在Python中读取和解析JSON

2.1.从字符串加载 JSON

要从字符串解析 JSON 数据,可以使用json.loads()函数。该函数将 JSON 格式的字符串转换为 Python 字典。

import json
​
json_string = '{"name": "Hanmeimei", "age": 25, "city": "Guangzhou"}'
data = json.loads(json_string)
print(data) # {'name': 'Hanmeimei', 'age': 25, 'city': 'Guangzhou'}

2.2.从文件加载 JSON

还可以使用json.load()直接从文件加载 JSON 数据。

import json
​
with open('data.json', 'r') as file:
    data = json.load(file)
    print(data)

处理JSON的错误

如果 JSON 数据格式错误,Python 将引发json.JSONDecodeError 。可以使用 try-except 块来处理此问题。

import json
​
json_string = '{"name": "Hanmeimei", "age": 25 "city": "Guangzhou"}''  #  缺少逗号
try:
    data = json.loads(json_string)
except json.JSONDecodeError as e:
    print(f"Error decoding JSON: {e}") 

3. 使用 JSON 数据

3.1.访问 JSON 对象中的数据

将 JSON 数据加载到 Python 字典中后,可以使用键轻松访问数据。

import json
​
json_string = '{"name": "Hanmeimei", "age": 25, "city": "Guangzhou"}'
data = json.loads(json_string)
​
print(data['name'])  # Output: Hanmeimei
print(data['age'])   # Output: 25

3.2.嵌套的JSON

JSON 对象可以包含嵌套字典和列表。可以通过链接键和索引来访问嵌套数据。在geojson中经常遇到嵌套字典和列表。

import json
​
nested_json = """{
    "person": {
        "name": "Hanmeimei",
        "address": {
            "city": "Guangzhou",
            "zipcode": "9999"
        }
    }
}"""
​
data = json.loads(nested_json)
print(data['person']['address']['city'])  # Output: Guangzhou

3.3.修改JSON

可以通过直接更改字典中的值来修改Python中的JSON数据。

import json
​
json_string = '{"name": "Hanmeimei", "age": 25, "city": "Guangzhou"}'
data = json.loads(json_string)
​
data['age'] = 26
print(data['age'])  # Output: 26

3.4.常用操作

3.4.1 检查字典的键

可以使用 in 关键字检查 JSON 数据中是否存在某个键。

if 'city' in data:
    print("没有找到城市")

3.4.2.迭代 JSON 对象

可以像使用字典一样迭代 JSON 对象。

for key, value in data.items():
    print(f"{key}: {value}")

4.将Python对象转换为JSON

4.1.将 Python 对象序列化为 JSON

可以使用json.dumps()函数将 Python 对象(如字典、列表等)转换为 JSON 字符串。

import json
​
data = {'name': 'Hanmeimei', 'age': 25, 'city': 'Guangzhou'}
json_string = json.dumps(data)
print(json_string) # {'name': 'Hanmeimei', 'age': 25, 'city': 'Guangzhou'}

4.2.将 JSON 写入文件

要将 JSON 数据写入文件,请使用json.dump()函数。

with open('output.json', 'w') as file:
    json.dump(data, file)

4.3.自定义 JSON 编码

可以使用indentsort_keys等参数自定义 JSON 编码的输出。

import json
​
data = {'name': 'Hanmeimei', 'age': 25, 'city': 'Guangzhou'}
​
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
#{
#    "age": 25,
#    "city": "Guangzhou",
#    "name": "Hanmeimei"
#}
​

image-20240912095420193

5.进阶的JSON处理

5.1 自定义序列化:处理复杂数据类型

有时可能需要序列化默认情况下不可 JSON 序列化的 Python 对象,例如日期时间对象。可以使用json.dumps()中的default参数来处理此问题。

import json
from datetime import datetime
​
def datetime_handler(x):
    if isinstance(x, datetime):
        return x.isoformat()
    raise TypeError("Unknown type")
​
data = {'name': 'Hanmeimei', 'date': datetime.now()}
json_string = json.dumps(data, default=datetime_handler)
​
print(json_string) # {"name": "Alice", "date": "2024-08-23T14:16:47.139272"}

image-20240912095922597

5.2高效解析大型 JSON 文件

对于大型 JSON 文件,如果希望以节省内存的方式解析数据。像ijson这样的工具允许我们迭代地解析 JSON 文件。

import ijson
​
with open('large_data.json', 'r') as file:
    for item in ijson.items(file, 'item'):
        print(item)

6. 使用 API:发送和接收 JSON

6.1.从 REST API 使用 JSON 数据

使用 API 时,如果需要使用 JSON 数据。以下是使用requests库执行此操作的方法。

import requests
​
response = requests.get('https://api.example.com/data')
data = response.json()
print(data)

6.2.通过 HTTP 请求发送 JSON 数据

要在 POST 请求中发送 JSON 数据,可以在requests.post()方法中使用json参数。

import requests
​
data = {'name': 'Hanmeimei', 'age': 25}
response = requests.post('https://api.example.com/submit', json=data)
print(response.status_code)

6.3.API 请求中的错误处理

使用 API 时,请务必检查响应状态并处理潜在的错误。

if response.status_code == 200:
    print("Success")
else:
    print("Failed")

7. 常见错误和实际操作

7.1.常见错误

格式错误的 JSON :确保 JSON 字符串格式正确,语法正确,例如匹配大括号和正确使用逗号。

不正确的数据类型:JSON 需要特定的数据类型(例如字符串、数字、布尔值)。确保数据类型与预期架构匹配。

键错误:访问 JSON 对象中不存在的键可能会导致错误。在访问之前始终检查密钥是否存在。

JSONDecodeError :尝试解码格式不正确的 JSON 字符串时会发生这种情况。使用 try- except 块来处理它。

大型 JSON 文件:将大型 JSON 文件完全加载到内存中可能会导致内存问题。考虑使用流式或迭代解析方法。

字符编码问题:确保 JSON 数据正确编码和解码,尤其是在使用非 ASCII 字符时。

可变默认参数:在处理 JSON 的函数中将可变对象(如列表或字典)作为默认参数传递时,可能会导致意外行为。

7.2.实际操作

处理前验证 JSON :始终根据架构验证 JSON 数据,以确保其满足预期标准。

使用 try- except 进行错误处理:实现错误处理以优雅地管理 JSONDecodeError 和 KeyError 等问题。

流式传输大型 JSON 文件:对于非常大的 JSON 文件,请使用ijson等流式库以避免内存问题。

缩进和排序键以提高可读性:序列化 JSON 时使用缩进和键排序,以提高可读性和调试性。

复杂类型的自定义序列化:为复杂的 Python 对象(例如日期或自定义类)实现自定义序列化函数。

使用“in”关键字进行安全密钥访问:在访问 JSON 对象中的密钥之前,请使用in关键字检查其是否存在。

一致的字符编码:在处理 JSON 数据时,尤其是在不同系统之间,确保字符编码的一致性(UTF-8 是标准)。

避免可变默认参数:定义处理 JSON 的函数时,避免使用可变对象作为默认参数,以防止意外的副作用。

保持 JSON 文件版本化:如果依赖于 JSON 配置或数据,请将其版本化以跟踪更改并保持一致性。

使用外部库优化性能:在性能至关重要时,使用ujsonpython-rapidjson等优化库来加快 JSON 解析和序列化速度。

8. JSON Schema 和规范

JSON Schema 是一种用于描述 JSON 数据结构的规范。它允许开发者定义 JSON 数据的结构和约束条件,从而可以验证 JSON 数据是否符合预期的模式。JSON Schema 本身也是 JSON 格式的数据。

8.1. 验证

可以使用jsonschema等库来根据架构验证 JSON 数据。

from jsonschema import validate
​
schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"}
    },
}
​
data = {"name": "Hanmeimei", "age": 25}
validate(instance=data, schema=schema)

8.2.用于 JSON 架构验证的工具和库

有几个工具和库可以帮助我们验证 JSON,例如jsonschemapydanticmarshmallow

9. 结论

在本指南中,我们探索了在 Python 中使用 JSON 的基础知识,从基本的解析和序列化到处理大文件和使用 JSON 架构验证数据等高级技术。掌握这些技能对于 Web 开发和其他 Python 应用程序中的高效数据交换至关重要。不断练习和探索其他工具以进一步增强我们的 JSON 处理能力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性规划中可行域为什么一定是凸的--证明

线性规划中的凸性证明 线性规划中可行域是凸的,这是自然能够想到和容易理解的道理。直观上,线性约束定义的可行域是由半平面的交集构成的,这些半平面的交集总是形成凸区域。 这么一个自然想到、容易理解的道理,怎么从数学上完备…

机器翻译与数据集_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录介绍机器翻译下载和预处理数据集词元化词表加载数据集训练模型对上述代码中出现的Vocab进行总体解释和逐行解释使用场景 小结练习答案1. num_examples 参数对词表大小的影响2. 对于没有单词边界的语言,单词级词元化的有效性 介绍…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了,发现还是写博客学的效率高点,在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点,用来验证这个平台的扩展性,以及总结一些学过的知识。…

Ngnix 在windows上的简单使用

安装 下载链接: nginx: download 选择页面中 Stable version 下的windows版本直接下载解压到本地。 运行nginx: 解压到本地后,结构如图: cmd 进入到上图的根目录,运行 start nginx ,即可开启。 打开 http://localhost 进行查看,如果正常打开nginx的测试页面,则说…

Nvidia的高级研究科学家Jim Fan预计在未来两到三年内,机器人技术将取得重大进展

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

pcdn盒子连接方式

连接方式 大部分连接方式如下 光猫拨号 → 路由器 → 盒子 优点:光猫负责拨号,路由器只需做路由转发,性能要求不高缺点:光猫会有一层nat,路由器还有一层nat,两层nat需要在两个设备上都做nat优化注意&…

mysql通过binlog做数据恢复

1 介绍 binlog(二进制日志)在 MySQL 中具有非常重要的作用。它记录了数据库的所有更改操作,主要用于数据恢复、复制和审计等方面。以下是 binlog 的主要作用: 1.数据恢复 binlog 可以用于恢复数据库中的数据。当数据库发生故障时…

Activiti7《第三式:破刀式》——工作流中的刀锋利刃

冲冲冲!开干 这篇文章将分为九个篇章,带你逐步掌握工作流的核心知识。欢迎来到 “破刀式” 篇章!在工作流的开发过程中,锋利的利器就是 精湛的设计与代码优化。本篇文章将探讨如何像一把利刃一样,用最直接的方式切入复…

phpword读取word docx文档文本及图片转html格式

最近在做一个PHP读取word文档功能,搜索一圈后决定选择用phpword第三方组件。 composer安装phpWord composer require phpoffice/phpword如果你的文件是doc格式,直接另存为一个docx就行了;如果你的doc文档较多,可以下一个批量转…

ZXing.Net:一个开源条码生成和识别器,支持二维码、条形码等

推荐一个跨平台的非常流行的条码库,方便我们在.Net项目集成条码扫描和生成功能。 01 项目简介 ZXing.Net是ZXing的.Net版本的开源库。支持跨多个平台工作,包括 Windows、Linux 和 macOS,以及在 .NET Core 和 .NET Framework 上运行。 解码…

Qwen 个人笔记

Qwen 个人笔记 Qwen的整体架构与Llama2类似,如下图所示: 1 Qwen2Config 1.1 Model 1.1.1 初始化 设置了模型的两个属性:padding_idx(用于指定填充标记的索引),vocab_size(词汇表的大小)初始化了模型的…

基于MATLAB的安全帽检测系统

课题名称 课题介绍 众所周知,在一些施工工地,必须明确佩戴安全帽。可以对生命安全起到保障作用。该课题为常见的安全帽的识别,主要分为红色,蓝色,黄色三类安全帽。而安全帽的主要是红色,蓝色&…

Dell PowerEdge 网络恢复笔记

我有一台Dell的PowerEdge服务器,之前安装了Ubuntu 20 桌面版。突然有一天不能开机了。 故障排查 Disk Error 首先是看一下机器的正面,有一个非常小的液晶显示器,只能显示一排字。 上面显示Disk Error,然后看挂载的硬盘仓&#…

【Mysql-索引总结】

文章目录 什么是索引索引类型索引的数据结构Hash索引有序数组二叉搜索树平衡二叉树B树B索引 索引使用规则索引失效的情况如何选择正确的列进行索引? 什么是索引 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中…

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪,这里我们通过SkyWalking来处理分布式日志; 场景描述:我们有三个服务消费者…

《JKTECH柔性振动盘:原理与多行业应用》东莞市江坤自动化科技有限公司

一、柔性振动盘的原理 柔性振动盘是一种新型的自动化上料设备,它采用先进的音圈电机技术和柔性振动技术,实现了对各种不规则形状、微小尺寸、易损伤零部件的高效上料和分拣。 其工作原理主要包括以下几个方面: 1. 音圈电机驱动 柔性振动盘内部…

电力施工作业安全行为检测图像数据集

电力施工作业安全行为检测图像数据集,图片总共 2300左右,标注为voc(xml)格式,包含高空抛物,未佩戴安全带,高处作业无人监护等。 电力施工作业安全行为检测图像数据集 数据集描述 这是一个专门用于电力施工作业安全行…

大数据新视界 --大数据大厂之AI 与大数据的融合:开创智能未来的新篇章

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

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

MySQL篇(存储引擎)(持续更新迭代)

目录 一、简介 二、使用存储引擎 1. 建表时指定存储引擎 2. 查询当前数据库支持的存储引擎 三、三种常见存储引擎 1. InnoDB存储引擎 1.1. 简介 1.2. 特点 1.3. 文件格式 1.4. 逻辑存储结构 表空间 段 区 页 行 2. MyISAM存储引擎 2.1. 简介 2.2. 特点 2.3. …