Python基础:JSON保存结构化数据(详解)
1. JSON概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生产。
虽然JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言(C、Python、C++、Java、PHP、Go等均支持)。
1.1 JSON语法规则
1)数据在键/值对
(key-value pair) 中
2)数据由逗号,
分隔
3)使用斜杠\
来转义字符
4)大括号{}
保存对象
5)中括号[]
保存数组,数组可以包含多个对象
1.2 JSON的两种结构
1.2.1 对象(键/值对)
大括号{}
保存的对象是一个无序的 键/值对
集合。一个对象以左括号{
开始, 右括号}
结束。一个键(key)和一个值(value)之间用冒号:
分隔,键/值对
之间用逗号,
分隔。
# 对象语法规则
{key1 : value1, key2 : value2, ... keyN : valueN }
# 对象示例
{"name": "John","age": 30,"city": "New York"
}
1.2.2 数组(array)
中括号[]
保存的数组是值(value)的有序集合。一个数组以左中括号[
开始, 右中括号]
结束,值之间使用逗号,
分隔。
数组的值(Value)可以是字符串、数值、布尔值、Null、对象、数组,且它们之间还可以进行嵌套。
#数组语法规则
[{ key1 : value1-1 , key2:value1-2 }, { key1 : value2-1 , key2:value2-2 }, { key1 : value3-1 , key2:value3-2 }, ...{ key1 : valueN-1 , key2:valueN-2 },
]
# 数组示例
{"sites": [{"name":"百度", "url": "http://www.baidu.com"},{"name":"谷歌", "url": "http://www.google.com"},{"name":"微博", "url": "http://www.weibo.com"}]
}
1.3 JSON支持的数据类型
对象(object):由花括号{}
包围的键值对集合。
数组(array):由方括号[]
包围的值的有序列表。
字符串(string):由双引号括起来的Unicode字符序列。
数字(number):整数或浮点数。
布尔值(true/false):表示真或假。
null:表示空值。
1.4 较复杂的JSON示例
{"name": "Alice","age": 25,"isStudent": true,"grades": [90, 85, 92],"address": {"street": "123 Main St","city": "Anytown","zip": "12345"}
}
2. Python中处理JSON格式数据
字符串可以很容易地写入文件或从文件中读取。 数字则更麻烦一些,因为 read()
方法只返回字符串,而字符串必须传给 int() 这样的函数,它接受 '123'
这样的字符串并返回其数值 123
。 当想要保存嵌套列表和字典等更复杂的数据类型时,手动执行解析和序列化操作将会变得非常复杂。
Python 允许使用流行的数据交换格式 JSON (JavaScript Object Notation),而不是让用户持续编写和调试代码来将复杂的数据类型存入文件中。 标准库模块json
可以接受带有层级结构的 Python 数据,并将其转换为字符串表示形式;这个过程称为serializing
。 根据字符串表示形式重建数据则称为 deserializing
。 在序列化和反序列化之间,用于代表对象的字符串可以存储在文件或数据库中,或者通过网络连接发送到远端主机。
2.1 导入 json 模块
首先要导入json
模块,实际上就是JSON编码和解码器的作用。
import json
json 模块主要包含了2种类型的函数:
json.dumps()
:对数据进行编码。json.loads()
:对数据进行解码。
在json
的编解码过程中,Python的原始类型与json
类型会相互转换。
Python编码为JSON类型转换对应表:
JSON解码为Python类型转换对应表:
2.2 Python编码为JSON格式数据
2.2.1 使用dumps方法
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)
import json# 列表对象
fruits = ["apple", "banana", "orange"]# 编码为 JSON 字符串
json_string = json.dumps(fruits, indent=2)
print('原始列表:',repr(fruits))
print('JSON对象:',json_string)
import json# 字典对象
person = {"name": "Alice","age": 25,"is_student": True,"grades": [90, 85, 92]
}# 编码为 JSON 字符串
json_string = json.dumps(person, indent=2)
print('原始字典:',person)
print('JSON对象:',json_string)
# 其他类型示例
import jsondata_str = 'Hello, JSON!'
data_num = 41.2
data_bool = True
data_none = Nonejson_str = json.dumps(data_str, indent=2)
json_num = json.dumps(data_num, indent=2)
json_bool = json.dumps(data_bool, indent=2)
json_none = json.dumps(data_none, indent=2)print("String的JSON对象:", json_str)
print("Number的JSON对象:", json_num)
print("Boolean的JSON对象:", json_bool)
print("None的JSON对象:", json_none)
2.2.2 使用dump方法
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
序列化为 JSON 格式化流形式的fp
(支持 .write()
的file-like object
)。
如果 skipkeys
是true
(默认为False
),那么那些不是基本对象(包括str
,int
、float
、bool
、None
)的字典的键会被跳过;否则引发一个TypeError
。
json
模块始终产生 str
对象而非bytes
对象。因此,fp.write()
必须支持 str
输入。
如果ensure_ascii
是 true
(即默认值),输出保证将所有输入的非 ASCII
字符转义。如果 ensure_ascii
是 false
,这些字符会原样输出。
如果 check_circular
为假值 (默认值: True
),那么容器类型的循环引用检查会被跳过并且循环引用会引发 RecursionError
(或者更糟的情况)。
如果 allow_nan
是 false
(默认为True
),那么在对严格 JSON 规格范围外的float
类型值(nan
、inf
和 -inf
)进行序列化时会引发一个 ValueError
。如果 allow_nan
是true
,则使用它们的 JavaScript 等价形式(NaN
、Infinity
和-Infinity
)。
如果indent
是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。 如果缩进等级为零、负数或者 ""
,则只会添加换行符。 None
(默认值) 选择最紧凑的表达。 使用一个正整数会让每一层缩进同样数量的空格。 如果indent
是一个字符串 (比如 "\t"
),那个字符串会被用于缩进每一层。
import jsondata = {'name': 'Scott','age': 18,'is_student':True,'grades':[100,99,60,88],'address':{'street':'东风东路757号','city':'广州','province':'广东省','zip':51000}
}with open('output_json.json','w',encoding='utf-8') as file_json:json.dump(data,file_json,ensure_ascii=False,indent=2)
2.3 Python解码JSON格式数据
2.3.1 使用loads方法
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)
import json# JSON 格式的字符串
json_string = '{"name": "Alice", "age": 25, "is_student": true, "grades": [90, 85, 92]}'# 解码为 Python 对象
python_object = json.loads(json_string)
print(python_object)
2.3.2 使用load方法
json.load()
方法将从JSON文件中读取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
(一个支持 .read()
并包含一个 JSON 文档的 text file
或者binary file
) 反序列化为一个 Python 对象。
object_hook
是一个将附带任意已解码的对象字面值 (即 dict)
来调用的可选函数。 object_hook 的返回值会代替 dict 使用。 此特性可被用于实现自定义解码器 。
object_pairs_hook
是一个可选的函数,它会被调用于每一个有序列表对解码出的对象字面量。
object_pairs_hook
的返回值将会取代原本的 dict
。这一特性能够被用于实现自定义解码器。如果 object_hook
也被定义,object_pairs_hook
优先。
import jsonwith open('output_json.json','r',encoding='utf-8') as file_json:load_data = json.load(file_json)print(load_data)
3. 应用场景
Python编程有很多涉及JSON文件或数据的场景,如爬虫时获取的网页信息、用于web配置文件、简单的用户数据持久化、游戏文件配置等等,很多都是简单方便的应用。
3.1 配置文件存储
JSON常用于存储配置信息,例如一个Web应用的配置文件:
# Web应用配置
web_app_config = {"app_name": "MyApp","debug_mode": True,"database": {"host": "localhost","port": 5432,"username": "admin","password": "secret"},"allowed_users": ["user1", "user2", "user3"]
}# 将配置信息写入JSON文件
with open('config.json', 'w') as json_file:json.dump(web_app_config, json_file, indent=4)
3.2 API相应处理
当与API进行交互时,常常会收到JSON格式的响应。
import requests# 发送API请求
response = requests.get('https://api.example.com/data')
# 将JSON响应转换为Python数据结构
api_data = json.loads(response.text)
# 处理数据
print(api_data)
3.3 数据持久化
JSON可用于数据的持久化存储,适用于小型应用或原型。例如,存储用户信息。
# 用户信息
users = [{"id": 1, "name": "Alice", "age": 25},{"id": 2, "name": "Bob", "age": 30},{"id": 3, "name": "Charlie", "age": 22}
]# 将用户信息写入JSON文件
with open('users.json', 'w') as json_file:json.dump(users, json_file, indent=4)
3.4 配置管理
在软件开发中,JSON经常用于配置管理。例如,一个游戏的配置文件:
# 游戏配置
game_config = {"title": "MyGame","resolution": {"width": 1920, "height": 1080},"sound": {"volume": 80, "mute": False},"controls": {"up": "W", "down": "S", "left": "A", "right": "D"}
}# 将游戏配置写入JSON文件
with open('game_config.json', 'w') as json_file:json.dump(game_config, json_file, indent=4)
4. 参考
官网:
https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#saving-structured-data-with-json
https://docs.python.org/3/library/json.html
菜鸟教程:
https://www.runoob.com/json/json-tutorial.html
https://www.runoob.com/python3/python3-json.html
相关文章:

Python基础:JSON保存结构化数据(详解)
1. JSON概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生产。 虽然JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解…...
抑郁症日常如何调节?
抑郁症是一种常见的心理障碍,影响患者的情绪、思维和身体健康。以下是一些建议,帮助抑郁症患者进行日常调节: 保持积极心态:积极的心态是应对抑郁症的关键。尝试保持乐观、积极的态度,看待生活中的困难和挑战。尽管抑…...
hive两张表实现like模糊匹配关联
testa表(字段a)aaabbacccddddddaaatestb表(字段b)ab1. 使用likeconcat模糊配对 selecta.a from testa a ,testb b where a like concat(%,b.b,%) group by a.a2. 使用locate函数 selecta.a from testa a ,testb b where locate(b.b,a.a)>0 group by a.a3. 使用instr函数 sel…...

【高效开发工具系列】Hutool DateUtil工具类
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
基于springcloud openfein 使用示例,包含代码和 maven 依赖配置
使用 Spring Cloud 和 OpenFeign 可以轻松实现微服务之间的通信。以下是一个简单的示例,演示如何在Spring Boot应用中使用Spring Cloud OpenFeign。 首先,确保您的项目中添加了 Spring Cloud 和 OpenFeign 的依赖。这里提供 Maven 依赖配置:…...

彰显营销硬实力!皓量科技连续四年入选《中国数字营销生态图》
11月28日,中国商务广告协会数字营销专业委员会、虎啸奖组委会、秒针营销科学院共同发布了《中国数字营销生态图(2023版)》(以下简称生态图)。凭借多年在广告营销领域的精耕细作,皓量科技从2020年开始连续4年…...

web静态网页设计与制作-基于HTML+CSS+JS实现旅游摄影网站
web静态网页设计与制作,基于HTMLCSSJS实现精美的旅游摄影网站,拥有极简的设计风格,丰富的交互动效,让人眼前一亮,享受视觉上的体验。 我使用了基本的HTML结构来构建网页,并使用CSS样式进行美化设计…...

每日一题:LeetCode-1089. 复写零
每日一题系列(day 09) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🔎…...

React Native环境搭建及Hello World
写这篇博客的目的就是想说,react native 挺简单,但是大部分初级前端会被环境搭建给难住,从而放弃. 环境搭建 环境搭建其实说简单也挺简单的,有经验的前端直接翻看react native中文文档就行,直接按上面来肯定没错 以下以安卓开发,windows配置环境为例,来演示一遍 首先 电脑…...

VS2017 C++ Qt工程打包软件
在Debug模式下或者Release模式下编译成功,会在工程的Debug文件夹和Release文件夹生成exe执行文件,以Debug为例,将Debug模式下的exe复制到新的文件夹路径下,然后打开Qt中的MSVC 2017 64-bit 打开后然后在命令窗口cd到exe的路径下&…...
【JWT的原理和使用】
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 文章目录 一、跨域认证的问题二、JWT 的原理三、JWT 的数据结构3.1 Header3.2 Payload3.3 Signature3.4 Base64URL 四、JWT 的使用方式五、JWT 的几个特点…...
对本地存储的有效期的理解
本地存储是一种在Web开发中常用的客户端存储数据的方式,它可以让网页应用程序在用户的浏览器中存储和检索数据,而无需依赖服务器来保存信息。本地存储的有效期是指数据存储在用户的设备上可以被访问和保留的时间段。在本地存储中,有两种主要的…...
蓝桥杯-02-蓝桥杯Java组考点与14届真题
文章目录 蓝桥杯Java组考点与14届真题参考资源Java组考点1. 组别2. 竞赛赛程3. 竞赛形式4. 参赛选手机器环境5. 试题形式5.1. 结果填空题5.2. 编程大题 6. 试题考查范围7. 答案提交8. 评分9. 样题样题 1:矩形切割(结果填空题)样题 2ÿ…...
门户网站二级等保评测问题,服务器漏洞问题解决办法
二级等保查出来的服务器问题 操作前可在自己服务器测试一下,看看有没有用 1.服务器定时更换密码 永久(需重启) vim /etc/login.defs PASS_MAX_DAYS 90 # 密码最长过期天数 PASS_MIN_DAYS 0 # 密码最小过期天数 PASS_MIN_LEN 10 # 密码…...
NPDP考前注意事项,这些细节你可要注意!
产品经理国际资格产认证(NPDP)2023年考试将于2023年12月2日(本周六)进行,你准备好了吗? 考试详情 考试时间:2023年12月2日 上午9:00-12:30 考试题型:200题,单选题。 考…...

八个优秀开源内网穿透工具
内网穿透(NAT穿透)是一种将本地网络服务暴露给互联网的一种技术。这种技术可以很好地解决许多局域网内的资源共享。采用路由的方式将一台计算机变成一个“路由器”,将公共的网络地址转为内部网络地址,从而实现通过英特网可以访问局…...

C语言贪吃蛇(有详细注释)
这个贪吃蛇是在比特特训营里学到的,同时我还写了用EasyX图形库实现的图形化贪吃蛇,含有每个函数的实现以及游戏中各种细节的讲解,感兴趣的可以去看一看。 贪吃蛇小游戏 实现效果 以下就是源码,感兴趣的小伙伴可以cv自己玩一玩改…...

MUI框架从新手入门【webapp开发教程】
文章目录 MUI -最接近原生APP体验的高性能前端框架APP开发3.25 开发记录miu框架介绍头部/搜索框:身体>轮播图轮播图设置数据自动跳转:九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器 心得与总结:MUI框架在移动应用开发中的应用M…...

HNU-计算机网络-讨论课2
第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题(每组自由选择N个,保证组内每人负责1个) 网络的发展促进信息的传播,极大提高了人类的感知能力,整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…...
西南科技大学信号与系统A实验一(信号的产生与时域运算)
目录 一、实验目的 二、实验原理 三、实验内容 四、思考题 一、实验目的 1、 掌握用matlab软件产生基本信号的方法。 2、 应用matlab软件实现信号的加、减、乘、反褶、移位、尺度变换及卷积运算 二、实验原理 (一) 产生信号波形的方法 利用Matlab软件的信号处…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...