Python基础:JSON保存结构化数据(详解)

news2024/9/22 21:14:05

在这里插入图片描述

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 json

data_str = 'Hello, JSON!'
data_num = 41.2
data_bool = True
data_none = None

json_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 json

data = {
    '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 json

with 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.coloradmin.cn/o/1249221.html

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

相关文章

基于C#实现Kruskal算法

这篇我们看看第二种生成树的 Kruskal 算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的。 一、思想 若存在 M{0,1,2,3,4,5}这样 6 个节点,我们知道 Prim 算法构建生成树是从”顶点”这个角度来思考的,然…

SOAP 协议和 HTTP 协议:深入解读与对比

SOAP 和 HTTP 协议 SOAP 协议 SOAP( Simple Object Access Protocol)是一种用于在节点之间交换结构化数据的网络协议。它使用XML格式来传输消息。它在 HTML 和 SMTP 等应用层协议的基础上进行标记和传输。SOAP 允许进程在整个平台、语言和操作系统中进…

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法: 第一步:需要自备华硕6个底包工厂安装包(EDN.KIT.OFS.SWP.HDI.TLK)或者自己备份的iso/esd/wim等镜像恢复 支持系列: 灵耀系列原装系统 无畏系列原装系统 枪…

基于 STM32Cube.AI 的嵌入式人脸识别算法实现

本文介绍了如何使用 STM32Cube.AI 工具开发嵌入式人脸识别算法。首先,我们将简要介绍 STM32Cube.AI 工具和 STM32F系列单片机的特点。接下来,我们将详细讨论如何使用 STM32Cube.AI 工具链和相关库来进行人脸识别算法的开发和优化。最后,我们提…

【matlab程序】matlab使用箭头在图像上标注

【matlab程序】matlab使用箭头在图像上标注 clear;clc;close all;x0:1/10000:2*pi; ysin(x); figure plot(x,y,LineWidth,2) x_begin 1; x_end 2; y_begin 0; y_end 0.2;annotation(arrow,XY2Norm(X,[x_begin,x_end]),XY2Norm(Y,[y_begin,y_end]),LineWidth,2,Color,r); …

HarmonyOS ArkTS 给应用添加通知和提醒(十二)

简介 随着生活节奏的加快,我们有时会忘记一些重要的事情或日子,所以提醒功能必不可少。应用可能需要在指定的时刻,向用户发送一些业务提醒通知。例如购物类应用,希望在指定时间点提醒用户有优惠活动。为满足此类业务诉求&#xf…

数字图像处理(实践篇)二 画出图像中目标的轮廓

目录 一 涉及的OpenCV函数 二 代码 三 效果图 一 涉及的OpenCV函数 contours, hierarchy cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) image:源图像。mode:轮廓的检索方式。cv2.RETR_EXTERNAL(只检测…

Tars框架 Tars-Go 学习

Tars 框架安装 网上安装教程比较多,官方可以参数这个 TARS官方文档 (tarsyun.com) 本文主要介绍部署应用。 安装完成后Tars 界面 增加应用amc 部署申请 amc.GoTestServer.GoTestObj 名称不知道的可以参考自己创建的app config 点击刷新可以看到自己部署的应用 服…

npm ERR! node-sass@4.13.0 postinstall: `node scripts/build.js`

npm ERR! node-sass4.13.0 postinstall: node scripts/build.js npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install npm run dev Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administr…

4.操作系统常见面试题(2)

3.4 虚拟内存 直接使⽤物理内存会产⽣⼀些问题 1. 内存空间利⽤率的问题:各个进程对内存的使⽤会导致内存碎⽚化,当要⽤ malloc 分配⼀块很⼤的内存空间时,可能会出现虽然有⾜够多的空闲物理内存,却没有⾜够⼤的连续空闲内存这种…

org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder

密码,加密,解密 spring-security-crypto-5.7.3.jar /** Copyright 2002-2011 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with t…

基于 STM32F7 和神经网络的实时人脸特征提取与匹配算法实现

本文讨论了如何使用 STM32F7 和神经网络模型来实现实时人脸特征提取与匹配算法。首先介绍了 STM32F7 的硬件和软件特点,然后讨论了人脸特征提取和匹配算法的基本原理。接下来,我们将重点讨论如何在 STM32F7 上实现基于神经网络的人脸特征提取与匹配算法&…

基于官方YOLOv4开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】

本文是关于基于YOLOv4开发构建目标检测模型的超详细实战教程,超详细实战教程相关的博文在前文有相应的系列,感兴趣的话可以自行移步阅读即可:《基于yolov7开发实践实例分割模型超详细教程》 《YOLOv7基于自己的数据集从零构建模型完整训练、…

Node.js入门指南(三)

目录 Node.js 模块化 介绍 模块暴露数据 导入模块 导入模块的基本流程 CommonJS 规范 包管理工具 介绍 npm cnpm yarn nvm的使用 我们上一篇文章介绍了Node.js中的http模块,这篇文章主要介绍Node.js的模块化,包管理工具以及nvm的使用。 Node…

微机原理_3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 在 8086 微机系统中,完成对指令译码操作功能的部件是()。 A. EU B. BIU C. SRAM D. DRAM 使计算机执行某…

迎接“全全闪”时代 XSKY星辰天合发布星海架构和星飞产品

11 月 17 日消息,北京市星辰天合科技股份有限公司(简称:XSKY星辰天合)在北京首钢园举办了主题为“星星之火”的 XSKY 星海全闪架构暨星飞存储发布会。 (图注:XSKY星辰天合 CEO 胥昕) XSKY星辰天…

【Redis】前言--介绍redis的全局系统观

一.前言 学习是要形成自己的网状知识以及知识架构图,要不最终都还是碎片化的知识,不能达到提升的目的,只有掌握了全貌的知识才是全解,要不只是一知半解。这章会介绍redis的系统架构图,帮助认识redis的设计是什么样的&a…

80C51单片机----数据传送类指令

目录 一.一般传送指令,即mov指令 1.16位传送(仅1条) 2.8位传送 (1)目的字节为A(累加器) (2)目的字节为Rn(工作寄存器) (3)目的字节为direct…

pulseaudio是如何测试出音频延迟的

通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。 那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。 那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。 /*占位…

【maven】【IDEA】idea中使用maven编译项目,报错java: 错误: 找不到符号 【2】

idea中使用maven编译项目,报错java: 错误: 找不到符号 错误状况展示: 如果报这种错,是因为项目中真的找不到报错的方法或者枚举 字段之类的,但实际是 : 点击 File Path