JSON文件存储
JSON 文件存储
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 对象,可以通过 dumps() 方法将 JSON 对象转为文本字符串。
例如,这里有一段 JSON 形式的字符串,它是 str 类型,我们用 Python 将其转换为可操作的数据结构,如列表或字典:
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 对象。由于最外层是中括号,所以最终的类型是列表类型。
这样一来就可以用索引来获取对应的内容了。例如,如果想取第一个元素里的 name 属性,就可以使用如下方式:
print(data[0]['name'])
print(data[0].get('name'))
得到的结果都是:
Bob
Bob
通过中括号加 0 索引,可以得到第一个字典元素,然后再调用其键名即可得到相应的键值。获取键值时有两种方式,一种是中括号加键名,另一种是通过 get 方法传入键名。这里推荐使用 get 方法,这样如果键名不存在,则不会报错,会返回 None。另外,get 方法还可以传入第二个参数(即默认值),示例如下:
print(data[0].get('age'))
print(data[0].get('age', 25))
运行结果:
None
25
尝试获取年龄 age,其实在原字典中该键名不存在,此时默认会返回 None。如果传入第二个参数(即默认值),那么在不存在的情况下返回该默认值。
值得注意的是,JSON 的数据需要用双引号来包围,不能使用单引号。例如,若使用如下形式表示,则会出现错误:
import json
str = '''
[{
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
}]
'''
data = json.loads(str)
运行结果:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)
会出现 JSON 解析错误的提示。因为这里数据用单引号来包围,请千万注意 JSON 字符串的表示需要用双引号,否则 loads 方法会解析失败。
下面实例从 JSON 文本中读取内容,例如这里有一个 data.json 文本文件,其内容是刚才定义的 JSON 字符串,可以先将文本文件内容读出,然后再利用 loads 方法转化:
import json
with open('data.json', 'r') as file:
str = file.read()
data = json.loads(str)
print(data)
运行结果如下:
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
还可以使用open方法读取文本文件,使用的是默认的读模式,编码指定为utf-8,并文件操作对象赋值为file。然后调用file对象的read方法读取了文本中的所有内容,赋值为str。接着再调用loads方法解析JSON字符串,将其转换为JSON对象。
还有更简便的写法,可以直接使用load方法传入文件操作对象,同样也可以将文本转化为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') as file:
file.write(json.dumps(data))
利用 dumps 方法,可以将 JSON 对象转为字符串,然后再调用文件的 write 方法写入文本。
运行结果:

如果想保存 JSON 的格式,可以再加一个参数 indent,代表缩进字符个数。示例如下:
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))
运行结果:

这样得到的内容会自动带缩进,格式会更加清晰。
如果 JSON 中包含中文字符,会怎么样呢?将之前的 JSON 的部分值改为中文,再用之前的方法写入到文本:
import json
data = [{
'name': ' 王伟 ',
'gender': ' 男 ',
'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))

结果中中文字符都变成了 Unicode 字符,这并不是想要的结果。
为了输出中文,还需要指定参数 ensure_ascii 为 False,另外还要规定文件输出的编码:
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(data, indent=2, ensure_ascii=False))
file.write(json.dumps(data, indent=2, ensure_ascii=False))
这样就可以输出 JSON 为中文了。
类比loads和load方法,dumps同样也有对应的dump方法,可以直接JSON对象全部写入文件中,因此上述方法也可以写成如下形式:
json.dump(data, open('data.json', 'w', encoding='utf-8'), indent=2, ensure_ascii=False)
第一个参数为JSON对象,第二个参数可以传入文件操作对象,其他的indent、ensure_ascii对象保持不变,运行结果是一样的。
JSON文件存储的更多相关文章
- Python3编写网络爬虫09-数据存储方式二-JSON文件存储
2.JSON文件存储 全称为JavaScript Object Notation 通过对象和数组的组合来表示数据,构造简洁且结构化程度非常高.是一种轻量级的数据交换格式 2.1 对象和数组 在Java ...
- 使用 Json 文件存储
将爬取到的数据以 Json 文件形式存储: import json import requests req = requests.get('http://www.baidu.com/') data = ...
- 爬虫json文件存储形式
json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...
- 爬虫文件存储:txt文档,json文件,csv文件
5.1 文件存储 文件存储形式可以是多种多样的,比如可以保存成 TXT 纯文本形式,也可以保存为 Json 格式.CSV 格式等,本节我们来了解下文本文件的存储方式. 5.1.1 TXT文本存储 将数 ...
- Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)
序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...
- 【BOOK】数据存储—文件存储(TXT、JSON、CSV)
数据存储 文本文件-TXT.JSON.CSV 关系型数据库-MySQL.SQLite.Oracle.SQL Server.DB2 非关系型数据库-MongoDB.Redis 文件打开 open() ...
- Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra
欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假 ...
- python webdriver 测试框架-数据驱动json文件驱动的方式
数据驱动json文件的方式 test_data_list.json: [ "邓肯||蒂姆", "乔丹||迈克尔", "库里||斯蒂芬", & ...
- csv、json 文件读取
1.CSV 文件存储 1.1 写入 简单示例 import csv with open('data.csv', 'a') as csvfile: writer = csv.writer(csvfile ...
- json和csv文件存储
一. json 1:基本概念 1.1 Json和Javascript JSON, 全称JavaScript Object Notation,它通过对象和数组的组合来表示数据.在JavaScript中一 ...
随机推荐
- dotnet 推荐一个使用 Json 直接路由通讯的 IPC 库
本文将和大家推荐一个我所在团队开源的本机多进程通讯 IPC 库,此 IPC 支持使用 JSON 格式进行直接路由通讯,具有使用方便,稳定性高,性能好的优点 这是我所在的团队在 GitHub 上使用最友 ...
- 2019-10-31-ASP.NET-Core-连接-GitLab-与-MatterMost-打造-devops-工具
title author date CreateTime categories ASP.NET Core 连接 GitLab 与 MatterMost 打造 devops 工具 lindexi 201 ...
- 高性能消息中间件-Nats使用
一.Nats简介 官网:https://nats.io/ 官网下载:https://nats.io/download/ github:https://github.com/nats-io/nats-s ...
- docker容器资源配额
1.docker 容器控制CPU docker通过cgroup来控制容器使用的资源限制,可以对docker限制的资源包括cpu.内存.磁盘 1.1 指定docker容器可以使用的cpu份额 # 查看配 ...
- 从零开始:Django项目的创建与配置指南
title: 从零开始:Django项目的创建与配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 后端开发 tag ...
- CompletableFuture学习总结
CompletableFuture 简介 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通 ...
- HJ212-2017协议数据采集和接收
1.客户端TCP和UDP的数据发送工具 工具和软件下载页面如下:http://www.zlmcu.com/document/tcp_debug_tools.html 2.服务端数据接收监控软件 IPA ...
- C#TMS系统学习(BaseCity页面)
C#TMS系统代码-基础页面BaseCity学习 本人纯新手,刚进公司跟领导报道,我说我是java全栈,他问我会不会C#,我说大学学过,他说这个TMS系统就给你来管了.外包已经把代码给我了,这几天先把 ...
- 2022年官网下安装ZooKeeper最全版与官网查阅方法
目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 其他版本安装 构建工具(参考工具部署方式) 一.环境整合 构 ...
- Linux 提权-Sudo_1
本文通过 Google 翻译 Sudo Part-1 – Linux Privilege Escalation - Juggernaut-Sec 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词 ...