在 Python 中使用 JSON

了解如何在 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.rhkb.cn/news/425978.html

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

相关文章

mongoDB-1

文章目录 一、疑似坑1.11.2 mongo ops manager1.3 mongo features视图固定大小集合(有点类似ringbuffer数据结构,capped collections)(聚簇集合)clustered collection(类比到Mysql的聚簇索引)聚合管道 aggregation pipelineWiredTiger (默认存…

uniapp微信小程序用户授权方法

效果 步骤 1&#xff09;div标签 <button type"primary" class"btn-login" click"getUserInfo">一键登录</button>2&#xff09;js方法 methods: {getUserInfo() {console.log("aaaa")uni.getUserProfile({desc: Wexin, …

iPhone 上丢失了重要的联系人?如何恢复已删除的 iPhone 联系人

丢失 iPhone 上的联系人可能会带来灾难。无论是一份很棒的新工作机会、潜在的恋爱对象&#xff0c;还是您一直想打电话的老朋友&#xff0c;如果您打开“联系人”应用时看到空白&#xff0c;这绝不是好事。不过&#xff0c;一切并非全无&#xff0c;仍然可以通过备份或专业软件…

Mamba对UNet王炸升级!全新混合架构参数小了116倍,精度依旧完成超车

UNet又升级了&#xff01;北大最新提出LightM-UNet&#xff0c;用Mamba设计1.8M参数UNet&#xff0c;比nnU-Net小了116倍&#xff0c;计算量减少21倍&#xff0c;精度依然SOTA&#xff01; 这种将Mamba与UNet结合的策略利用了两者在图像处理和网络架构上的优势&#xff0c;既能…

Renesas R7FA8D1BH (Cortex®-M85)控制SHT20

目录 概述 1 硬件接口介绍 2 SHT20模块 2.1 SHT20简介 2.2 SHT-20模块电路 3 I2C接口实现 3.1 FSP配置I2C 3.2 I2C驱动程序实现 4 SHT20驱动程序 4.1 SHT20驱动代码结构 4.2 源代码文件 5 测试 5.1 测试功能介绍 5.2 测试代码实现 5.3 运行代码 概述 本文主要介…

持续集成与持续交付CI/CD

CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是一种软件开发实践&…

BFS 解决边权为1的最短路问题

边权为1的最短路问题 最短路问题&#xff1a; 比如说从D->K&#xff0c;找出最短的那条&#xff0c;其中每条路都是有权值&#xff0c;此篇主要讲解的边权为1的最短路问题。 即边权都是一样的。 解法就是从起点开始&#xff0c;做一次BFS&#xff1a; 需要一个队列、一个…

Spring-IOC容器-ApplicationContext

IOC:Inversion of Control 控制反转&#xff0c;是一种设计原则&#xff0c;spring 中通过DI&#xff08;dependency Injection&#xff09;来具体实现。 比如原本对象的实例化&#xff0c;是通过程序主动New出来&#xff0c;IOC中的对象实例交给Spring框架来实例化&#xff0…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0917)

七、引入 element-ui 组件库 官方文档&#xff1a; https://element-plus.org/zh-CN/ 安装 $ pnpm add element-plus自动按需&#xff1a; 安装插件 pnpm add -D unplugin-vue-components unplugin-auto-import然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中 ..…

maxcompute使用篇

文章目录 maxcompute使用篇1.mongoDB与maxcompute 进行数据同步1.1 基本类型的数据1.2部分复杂类型的数据 2.maxcompute中复杂数据类型解析2.1 get_json_object2.2 json_tuple2.3 处理json几种失效的情况:2.4 STR_TO_MAP、MAP_KEYS2.5 regexp_replace2.6 FROM_JSON2.7 nvl2.8 t…

【Hot100】LeetCode—51. N 皇后

目录 1- 思路题目识别回溯 2- 实现⭐51. N 皇后——题解思路 3- ACM 实现 原题链接&#xff1a;51. N 皇后 1- 思路 题目识别 识别1 &#xff1a;给定一个整数 n &#xff0c;求解如何放置棋子的问题。 回溯 回溯三部曲 1- 回溯参数和返回值 传参 cheeseBoard、n、row 传递…

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数&#xff0c;其值不超过1000。如果n是非负整数&#xff0c;则该函数必须在一行中打印出n!的值&#xff0c;否则打印“Invalid input”。 首先&#xff0c;知道阶乘是所有小于及等于该数的…

Solidity优质例子(一)食品溯源智能合约

这个智能合约FoodInfoItem的功能是管理食品的追溯信息&#xff0c;包括食品在不同阶段的流转、质量记录、消费者评分等。它通过区块链记录食品的生产、分销和销售过程&#xff0c;确保每一环节的透明和不可篡改性。 实际生活中的用途&#xff1a; 食品安全和质量控制&#xff1…

实时数仓3.0DWD层

实时数仓3.0DWD层 DWD层设计要点&#xff1a;9.1 流量域未经加工的事务事实表9.1.1 主要任务9.1.2 思路9.1.3 图解9.1.4 代码 9.2 流量域独立访客事务事实表9.2.1 主要任务9.2.2 思路分析9.2.3 图解9.2.4 代码 9.3 流量域用户跳出事务事实表9.3.1 主要任务9.3.2 思路分析9.3.3 …

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一&#xff0c;地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址&#xff0c;把整个机器内存比作一个酒店&#xff0c;内存单元就是这个酒店的各个房间&#xff0c;给这些房间编的门牌号&#xff0c;类比回来就是内存单元的物理地址 在第一篇介绍debug的…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下&#xff0c;智慧水利作为重要的基础设施之一&#xff0c;正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司&#xff08;以下简称“江河信息”&#xff09;作为高新技术国有企业&#xff0c;坚定致力于打造数…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

springbootadmin源码编译修改001_node版本管理工具nvm_任意切换node版本_没有成功记录过程---VUE工作笔记0026

由于项目需要对springbootadmin的源码进行编译和修改. 但是springbootadmin的源码编译很麻烦,主要是由于,springbootadmin-server-ui这个项目,因为他是一个前后端分离的 vue项目,而且是使用 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 首先去下载,发…

无人机培训机构技术股份合作探讨

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、物流、环境监测、应急救援等多个领域展现出巨大潜力&#xff0c;市场对无人机专业人才的需求急剧增加。鉴于此&#xff0c;多家致力于无人机培训教育的机构决定携手合作&#xff0c;通过技术股份合作模式&#xff0c;共同…