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软件的信号处…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...