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,intfloatboolNone)的字典的键会被跳过;否则引发一个TypeError
  json模块始终产生 str 对象而非bytes 对象。因此,fp.write() 必须支持 str 输入。
  如果ensure_ascii true(即默认值),输出保证将所有输入的非 ASCII 字符转义。如果 ensure_ascii false,这些字符会原样输出。
  如果 check_circular 为假值 (默认值: True),那么容器类型的循环引用检查会被跳过并且循环引用会引发 RecursionError(或者更糟的情况)。
  如果 allow_nanfalse(默认为True),那么在对严格 JSON 规格范围外的float 类型值(naninf-inf)进行序列化时会引发一个 ValueError。如果 allow_nan true,则使用它们的 JavaScript 等价形式(NaNInfinity -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

在这里插入图片描述

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

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

相关文章

三菱PLC编码器转速测量功能块(梯形图和ST代码)

编码器转速测量功能块算法公式详细讲解请参考下面文章链接: SMART PLC编码器转速测量功能块(高速计数器配置+梯形图)-CSDN博客文章浏览阅读427次。里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,…

Springboot实现增删改差

一、包结构 二、各层代码 (1)数据User public class User {private Integer id;private String userName;private String note;public User() {super();}public User(Integer i, String userName, String note) {super();this.id i;this.userName userName;this.note note;…

抖音生态融合:开发与抖音平台对接的票务小程序

为了更好地服务用户需求,将票务服务与抖音平台结合,成为了一个创新的方向。通过开发票务小程序,用户可以在抖音平台上直接获取相关活动的票务信息,完成购票、预订等操作,实现了线上线下的有机连接。 一、开发过程 1…

线程池(用于处理Runnable任务或Callable任务)

一&#xff0c;线程池 二&#xff0c; 如何创建线程池 案例&#xff1a; //1,通过ThreadPoolExecuter创建一个线程池对象ExecutorService pool new ThreadPoolExecutor(3,5,8,TimeUnit.SECONDS,new LinkedBlockingQueue<>(4),Executors.defaultThreadFactory(),new Thr…

关于pytorch以及相关包的安装教程

一.查看自己电脑的配置 首先查看自己电脑的cuda的版本&#xff0c;WinR,敲入cmd打开终端 输入nvidia-smi&#xff0c;查看自己电脑的显卡等配置 这里要说明一下关于这个CUDA,它具有向后兼容性&#xff0c;这意味着支持较低版本的 CUDA 的应用程序通常也可以在较高版本的 CUD…

E5052A/安捷伦Agilent E5052A信号源分析仪

181/2461/8938产品概述 是德科技E5052A(安捷伦)信号源分析仪&#xff0c;10 MHz至7 GHz&#xff0c;具有许多增强的性能特征。在表征VCO或其它类型的高频信号源、aw以及高速数据通信系统中的时钟抖动评估方面&#xff0c;它提供了世界上最高的测量吞吐量和最佳可用性。 是德科…

Python武器库开发-前端篇之CSS盒模型(三十一)

前端篇之CSS盒模型(三十一) CSS盒模型是指网页中的每个元素可以看做是一个矩形盒子&#xff0c;该盒子有四个主要部分组成&#xff1a;content、padding、border和margin。其中&#xff1a; content&#xff1a;指盒子中的内容区域&#xff0c;可以包含文本、图像、视频、其他…

【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25

目录 什么是浅拷贝&#xff1f;浅拷贝的问题使用深拷贝解决浅拷贝问题结束语 什么是浅拷贝&#xff1f; 如果在一个类中没有人为定义拷贝函数&#xff0c;则系统会提供默认拷贝函数。那么在此默认拷贝函数中主要进行了简单的赋值操作&#xff0c;那这个简单的赋值操作我们一般…

RK3568驱动指南|第八篇 设备树插件-第72章 设备树插件语法和编译实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

曲线拟合:走进数据建模中的艺术与科学

在现代科学和工程领域&#xff0c;曲线拟合是一项重要的数据分析技术&#xff0c;它可以通过数学模型来近似描述实际数据中的复杂关系。本文将详细介绍曲线拟合的基本概念、方法和应用领域&#xff0c;并探究其在数据建模中的艺术与科学。 第一节&#xff1a;曲线拟合的基本概…

中职网安-Linux操作系统渗透测-Server2130(环境加qq)

B-9:Linux操作系统渗透测 任务环境说明:  服务器场景:Server2130  服务器场景操作系统:Linux(关闭链接) 1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交; 2.…

【Java并发】聊聊创建线程池的几种方式以及实际生产如何应用

上一篇文章&#xff0c;主要讲述了如果通过线程池进行执行任务&#xff0c;以及相关的核心流程&#xff0c;线程执行框架本身提供了一系列的类&#xff0c;封装了线程创建、关闭、执行、管理等跟业务逻辑无关的代码逻辑&#xff0c;一方面将业务和非业务逻辑进行解耦合&#xf…