JSON 文件存储

news2024/9/22 17:31:28

JSON 全称为: JavaScript Object Notation  也就是 javaScript 对象标记,通过对象和数组的组合来表示数据, 虽然构造简洁,但是结构化程度非常高, 是一种轻量级的数据交换格式

对象和数组

在 JavaScript 语言中, 一切皆为对象,因此任何支持的数据类型都可以通过 JSON 表示, 例如字符串,数字,对象,数组等。 其中对象和数组是比较特殊且常用的类型

对象在 JavaScript 中是指用花括号 {} 包裹起来的内容, 数据结构是 {key1: value1, key2: value2,......}这种键值对结构。在面向对象语言中, key 表示对象属性, value 表示属性对应的值, 前者可以使用整数和字符串表示。 后者可以是任意类型

数组在 JavaScript 中是指用 方括号 [ ] 包裹起来的内容, 数据结构式 ["java", "javascript", "vb",.....]这种索引结构。 在 JavaScript 中, 数组是一种比较特殊的数据类型, 因为它可以像对象那样使用键值对结构, 但还是索引结构用的比较多。 同样,它可以是任意类型

JSON 结构类型

[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
    "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]

由 [ ] 包围的内容相当于数组, 数组中的每个元素都可以是任意类型, 这个实例中的元素是对象, 由 { } 包裹

JSON 可以由以两种形式自由组合而成, 能够嵌套无限次, 并且结构清晰, 是数据交换的极佳实现方式

读取 JSON

Python 为我们提供了简单易用的 JSON 库, 用来实现 JSON 文件的读写操作, 我们可以调用 JSON 库中的 loads 方法将 JSON 文本字符串转为 JSON 对象。 实际上, JSON 对象就是 Python 中列表和字典的嵌套组合。 反过来我们可以通过 dumps 方法将 JSON 对象转为文本字符串

 

import json

str = '''
[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
    "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))

<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
<class 'list'>

这里使用 loads 方法将字符串转为了 JSON 对象。 由于最外层是中括号,所以最终的数据类型是列表类型,这样,我们就可以用索引获取内容了。

data[0]['name']
data[0].get('name')

'Bob'

以中括号加 0  作为索引, 可以得到第一个字典元素, 在调用其键名即可以得到相应的键值。获取键值的方式有两种,一种是括号加键名, 另一种是利用 get 方法传入键名。 这里推荐使用 get 方法,这样即使键名不存在也不会报错,而是放回 None 。而且 get 方法也可以传入第二个参数(即默认值)

print(data[0].get('age'))
data[0].get('age', 25)

None
25

这里尝试获取年龄 age, 原字典中并不存在该键名, 因此会默认返回 None , 此时如果传入了第二个参数, 就返回传入的值

值得注意的是: JSON  的数据需要用双引号包围起来, 而不能使用单引号。 

import json

data = [{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
data1 = json.loads(str)
print(data1)

这里教程里说的是会报错,但是我这里实际运行并没有报错而是正确运行了,不过双引号,还是要注意一下的

[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]

读取 json 文本文件

import json
with open('data.json', encoding='utf-8') as file:
    str = file.read()
    data = json.loads(str)
    print(data)

这里首先需要你有一个 data.json 的文本文件,其内容是刚刚定义的字符串。

首先使用 open 方法读取文本文件, 使用的是默认的读模式, 编码指定为 utf-8 , 并将文件操作对象赋值为 file , 然后我们调用 file 对象的 read 方法读取了文本中的所有内容, 赋值为 str , 接着再调用 Loads 方法解析 JSON 字符串, 将其转换为 JSON 对象

简单写法:

import json
data = json.load(open('data.json', encoding='utf-8'))
print(data)

注意这里使用的是 load 方法 而不是 loads 方法。 前者的参数是一个文件操作对象, 后者的参数是一个 JSON 字符串

这两种写法的结果完全一样, 只不过 load 方法是将整个文件中的内容转化为 JSON 对象, 而 loads 方法 可以更灵活的控制转化哪些内容。 

输出 JSON

可以调用 dumps 方法将 JSON 对象转化为字符串。

import json
data = [{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data))

这里利用 dumps 方法, 将 JSON 对象转为字符串, 然后调用文件的 write 方法将字符串写入文本

另外,如果想保存 JSON 对象的缩进格式,可以再往 dumps 方法中添加一个参数 indent, 代表缩进字符的个数

with open('data.json', 'w') as file:
    file.write(json.dumps(data,indent=2))

感觉并没有什么变化

那么如果存在中文会怎么样

import json

data = [{
    'name': ' 王伟 ',
    'gender': ' 男 ',
    'birthday': '1992-10-18'
}]
with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2))

我的显示正常, 教程说是会有问题,会显示 Unicode 字符

解决方法

with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2, ensure_ascii=False))

在 json.dumps 中添加一个 ensure_ascii=False

类比 loads 和 load 方法 ,  dumps 和 dump 也有简写方法

json.dump(data, open('data.json', 'w', encoding='utf-8'), indent=2, ensure_ascii=False)

这里第一个参数传入 JSON 对象, 第二个参数可以传入文件操作对象,其他保持不变,运行结果一样

 

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

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

相关文章

MAT使用

概念 Shallow heap & Retained Heap Shallow Heap就是对象本身占用内存的大小。 Retained Heap就是当前对象被GC后&#xff0c;从Heap上总共能释放掉的内存(表示如果一个对象被释放掉&#xff0c;那会因为该对象的释放而减少引用进而被释放的所有的对象&#xff08;包括…

用Docker来辅助开发

现在好像用Docker是越来越多了。之前其实也看过docker的原理&#xff0c;大概就是cgroup那些&#xff0c;不过现在就不看原理了&#xff0c;不谈理论&#xff0c;只看实际中怎么用&#xff0c;解决眼前问题。 用docker来做开发&#xff0c;其实就是解决的编译环境的差异&#…

解决kkfileview 使用https预览问题记录

场景&#xff1a;项目使用了开源的kkfileview进行文件在线预览&#xff0c;部署方式使用的是docker&#xff0c;使用IP进行访问&#xff0c;但是http协议直接访问有漏洞告警&#xff0c;现在需要调整为https&#xff0c;且仍然需要使用IP访问。 kkfileview官网kkFileView - 在线…

大数据架构体系演进

传统离线大数据架构 ​ 21世纪初随着互联网时代的到来&#xff0c;数据量暴增&#xff0c;大数据时代到来。Hadoop生态群及衍生技术慢慢走向“舞台”&#xff0c;Hadoop是以HDFS为核心存储&#xff0c;以MapReduce&#xff08;简称MR&#xff09;为基本计算模型的批量数据处理…

重新盘点更新!靠谱且实用的8个AI绘画网站,国产之光

在从事AI绘画领域研究期间&#xff0c;结识了众多新朋友。越来越多人问AI工具就会在问国内用什么&#xff0c;国内什么好用&#xff0c;大家都知道了SD和MJ属于AI绘图领域的两尊大神&#xff0c;问国内其实背后是希望简简单单画图&#xff0c;能快捷方便体验&#xff0c;并且出…

深入理解Linux网络(八):内核如何发送网络包

深入理解Linux网络&#xff08;八&#xff09;&#xff1a;内核如何发送网络包 一、总览二、网卡启动准备三、ACCEPT 创建新 SOCKET四、开始发送数据send 系统调⽤实现传输层处理传输层拷贝传输层发送 网络层发送原理邻居⼦系统网络设备子系统软中断调度igb网卡驱动发送发送完成…

集成学习在数学建模中的应用

集成学习在数学建模中的应用 一、集成学习概述&#xff08;一&#xff09;基知&#xff08;二&#xff09;相关术语&#xff08;三&#xff09;集成学习为何能提高性能&#xff1f;&#xff08;四&#xff09;集成学习方法 二、Bagging方法&#xff08;一&#xff09;装袋&…

YOLO--置信度(超详细解读)

YOLO&#xff08;You Only Look Once&#xff09;算法中的置信度&#xff08;Confidence&#xff09;是一个关键概念&#xff0c;用于评估模型对预测框内存在目标对象的信心程度以及预测框对目标对象位置的准确性。 一、置信度的定义 数值范围&#xff1a;置信度是一个介于0和…

分享 12 款免费开源 Ai 编码助手,助您简化开发工作流程

AI 编码助手是一种利用人工智能和机器学习来帮助开发人员编写、调试和优化代码的软件工具。这些助手旨在理解自然语言提示并提供代码建议、生成代码片段&#xff0c;甚至根据提供的上下文完成整个功能。 它们与 Visual Studio Code、IntelliJ IDEA 等流行的开发环境集成&#…

uniapp原生插件开发实战——iOS打开文件到自己的app

用原生开发获取文件的名称、路径等能力封装为一个插件包供前端使用 首先根据ios插件开发教程,创建一个插件工程,template 选framework 开始编写代码: iOS 9 及以下版本会调用以下方法: - (BOOL)application:(UIApplication *_Nullable)application openURL:(NSURL *_Nul…

《简历宝典》18 - 简历中“技术能力”,如何丰满且有层次,Java篇

上一节&#xff0c;我们学习了前端开发&#xff0c;在简历中的 “技术能力” 模块的书写。这一节&#xff0c;我们说一下Java开发的 “技术能力” 该如何书写&#xff0c;从而使这个模块更加的丰满且有层次感。 目录 1 Java开发工作所包含的技能点 2 招聘市场对Java开发的要…

【人工智能 | 机器学习 | 理论篇】模型评估与选择

文章目录 1. 经验误差与过拟合2. 模型评估方法2.1 模型评估概念2.2 留出法2.3 k 折交叉验证法2.4 自助法2.5 调参与最终模型 3. 性能度量3.1 均方误差3.2 错误率、精度3.3 查准率、查全率3.3 扩展3.4 ROC 与 AUC3.5 代价敏感错误率与代价曲线 4. 比较检验4.1 假设检验4.2 交叉验…

精亿内存条玄武光影系列DDR4 7200 RGB电竞内存条鲁大师跑分实测42万分 国货老牌 国产卫士在D5价格就不会起飞

精亿玄武光影DDR4 7200 RGB电竞内存条是一款高性能的内存产品,适用于追求极致性能的游戏玩家和电脑爱好者。根据你提供的信息,这款内存条在鲁大师跑分中获得了42万分的成绩,说明其性能表现非常出色。 精亿玄武光影DDR5 7200 RGB电竞内存 以下是关于这款内存条的一些特点和优势…

【Javascript】前端面试基础2【每日学习并更新10】

模块化开发是怎样做的&#xff1f; 立即执行函数&#xff0c;不暴露私有成员 异步加载JS的方式有哪些 那些操作会造成内存泄漏 是什么&#xff1a;内存泄漏指任何对象在您不再拥有或需要它之后仍然存在造成内存泄漏&#xff1a; setTimeout的第一个参数使用字符串而非函数的…

Windows系统设置暂停更新,暂停时间可达3000天,“永久”暂停更新,亲测有效

好多小伙伴被Windows系统的更新搞得很烦&#xff0c;经常在使用中自己下载更新包&#xff0c;占用网路资源&#xff0c;过段时间就要更新&#xff0c;特别讨厌 今天教你一招&#xff0c;可以暂停更新长达3000天&#xff0c;亲测有效 1、打开系统CMD命令执行窗口&#xff0c;输…

Linux -软件安装

1.为什么安装软件 项目开发好需要部署&#xff0c;而项目本身可能依赖其他软件。 这时在部署项目时就需要安装依赖的软件。 比如: jdk mysql tomcat redis rabbitmq es等 2. centos软件安装的方式 1. 二进制安装。---只需要解压就可以。 只针对特殊平台。 比如jdk tomcat 2. R…

迈巴赫GLS480升级魔术车身空气悬挂脱困系统有哪些实际作用

迈巴赫 GLS480 升级智能魔术车身脱困系统具有以下实际作用&#xff1a; 1. 增强脱困能力&#xff1a;在车辆陷入困境&#xff0c;如泥泞、沙地或雪地时&#xff0c;该系统能够通过主动调整悬挂和车轮的动力分配&#xff0c;帮助车辆更有效地摆脱困境。 2. 提升行驶稳定性&…

测试基础(二)

目录 等价类划分 解决问题 说明 分类 步骤 应用场景 边界值分析 解决问题 选择节点 步骤 优化 判定表 解决问题 说明 定义 组成 规则 步骤 应用场景 场景法 说明 应用场景 注意 错误推荐法 定义 应用场景 等价类划分 解决问题 穷举问题。 说明 等…

synchronized、volatile与CAS:Java线程同步机制概览

synchronized、volatile与CAS&#xff1a;Java线程同步机制概览 1、synchronized&#xff08;悲观锁&#xff09;2、volatile&#xff08;轻量级同步&#xff09;3、CAS&#xff08;乐观锁&#xff0c;非阻塞&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#x…

职场进阶:从职场小白到专家的心路历程与实战策略

职场进阶&#xff1a;从职场小白到专家的心路历程与实战策略 引言 在职场这条漫长而充满挑战的道路上&#xff0c;每个人都渴望找到属于自己的那片天空。从初入职场的懵懂小白&#xff0c;到最终成为某一领域的专家&#xff0c;这不仅仅是一个职位晋升的过程&#xff0c;更是个…