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))
运行结果:
with open('data.json', 'w', encoding='utf-8') as file:
    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文件存储的更多相关文章

  1. Python3编写网络爬虫09-数据存储方式二-JSON文件存储

    2.JSON文件存储 全称为JavaScript Object Notation 通过对象和数组的组合来表示数据,构造简洁且结构化程度非常高.是一种轻量级的数据交换格式 2.1 对象和数组 在Java ...

  2. 使用 Json 文件存储

    将爬取到的数据以 Json 文件形式存储: import json import requests req = requests.get('http://www.baidu.com/') data = ...

  3. 爬虫json文件存储形式

    json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...

  4. 爬虫文件存储:txt文档,json文件,csv文件

    5.1 文件存储 文件存储形式可以是多种多样的,比如可以保存成 TXT 纯文本形式,也可以保存为 Json 格式.CSV 格式等,本节我们来了解下文本文件的存储方式. 5.1.1 TXT文本存储 将数 ...

  5. Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)

    序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...

  6. 【BOOK】数据存储—文件存储(TXT、JSON、CSV)

    数据存储 文本文件-TXT.JSON.CSV 关系型数据库-MySQL.SQLite.Oracle.SQL Server.DB2 非关系型数据库-MongoDB.Redis   文件打开 open() ...

  7. Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra

    欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假 ...

  8. python webdriver 测试框架-数据驱动json文件驱动的方式

    数据驱动json文件的方式 test_data_list.json: [ "邓肯||蒂姆", "乔丹||迈克尔", "库里||斯蒂芬", & ...

  9. csv、json 文件读取

    1.CSV 文件存储 1.1 写入 简单示例 import csv with open('data.csv', 'a') as csvfile: writer = csv.writer(csvfile ...

  10. json和csv文件存储

    一. json 1:基本概念 1.1 Json和Javascript JSON, 全称JavaScript Object Notation,它通过对象和数组的组合来表示数据.在JavaScript中一 ...

随机推荐

  1. [FAQ] jsoneditor 如何切换 mode 或者选择 modes

    1. 用于切换编辑器模式:text.tree.code JSONEditor.setMode(mode) 2. 让 mode 变成可以选择的: const options = { modes: ['t ...

  2. dotnet 6 在 win7 系统 AES CFB 抛出不支持异常

    本文记录在 win7 系统上调用 AES 加密时,采用 CFB 模式,可能抛出 CryptographicException 异常 可以看到抛出的异常提示是 System.Security.Crypt ...

  3. WPF 已知问题 某些设备上的应用在 WindowChromeWorker 抛出 System.OverflowException 异常

    准确来说,这个不算是 WPF 的问题,而是系统等的问题.在某些设备上的使用了 WindowChrome 功能的 WPF 应用,将在运行过程,在 WindowChromeWorker 类里面抛出 Sys ...

  4. 开源相机管理库Aravis例程学习(五)——camera-api

    目录 简介 例程代码 函数说明 arv_camera_get_region arv_camera_get_pixel_format_as_string arv_camera_get_pixel_for ...

  5. 由初中生实现的 Windows 12 网页版!

    大家好,我是 Java陈序员. 这几天,逛 Github 的时候,看到了一个项目 win12 -- 仿 Windows12 网页版!被它实现的页面功能震撼到了,大家可以一起来感受下! 首先是登录页面. ...

  6. 如何禁用IntelliJ IDEA的LightEdit模式

    更新pycharm之后发现有了个新功能,默认打开文件的时候会单独打开一个窗口,以文本编辑的模式打开,而不是用项目模式.这种打开方式被称为LightEdit Mode.效果如下, 可以注意到窗口很简洁, ...

  7. kubernetes 存储流程

    PV 与 PVC PVC (PersistentVolumeClaim),命名空间(namespace)级别的资源,由 用户 or StatefulSet 控制器(根据VolumeClaimTempl ...

  8. 【深度学习】基础--NumPy

    因为深度学习会应用到我们大学时候学习的数学知识---线性代数.(矩阵当年想起来还是挺有意思的,有考研的经历都有感觉) 而在计算机里面如何展示矩阵的计算和应用,就需要运用到NumPy,是Python的一 ...

  9. C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)

    前言 本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考. 用 ...

  10. SaltStack 常用的一些命令

    以下是 SaltStack 常用的一些命令: 查看帮助信息:salt --help检查Salt支持的操作系统:salt '*' test.ping查看Minion的版本号:salt '*' test. ...