JSON 的基础知识
JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,它是一种轻量级的数据交换格式。JSON 的数据格式既适合人来读写,也适合计算机本身解析和生成。最早的时候,JSON 是 JavaScript 语言的数据交换格式,后来慢慢发展成一种语言无关的数据交换格式,这一点非常类似于 XML。
JSON 主要在类似于C 的编程语言中广泛使用,这些语言包括 C、C++、C#、Java、JavaScript、Perl、Python 等。JSON 提供了多种语言之间完成数据交换的能力,因此,JSON 也是一种非常理想的数据交换格式。
Python JSON 模块
json 模块提供了对 JSON 的支持,它既包含了将 JSON 字符串恢复成 Python 对象的函数,也提供了将 Python 对象转换成 JSON 字符串的函数。
当程序把 JSON 对象换成 Python 对象时,转换关系如表 1所示:
JSON 类型 | Python 类型 |
---|---|
对象(object) | 字典(dict) |
数组(array) | 列表(list) |
字符串(string) | 字符串(str) |
整数(number(int)) | 整数(int) |
实数(number(real)) | 浮点数(float) |
true | True |
false | False |
null | None |
当程序把 Python 对象转换成 JSON 格式字符串时,转换关系如表2所示:
Python 类型 | JSON 类型 |
---|---|
字典(dict) | 对象(object) |
列表(list)和元组(tuple) | 数组(array) |
字符串(str) | 字符串(string) |
整型、浮点数(float,int) | 数值型(number) |
True | true |
False | false |
None | null |
序列化和反序列化
要知道JSON的应用场景,先要了解两个概念,即序列化和反序列化。什么是序列化,什么是反序列化呢?
举个栗子,很多人在玩王者荣耀游戏的时候,团战正激烈进行中,突然有急事要处理,如果不及时处理的话会产生一系列麻烦的后果。那怎么办呢?这时候玩家通常会选择挂起。游戏挂起,相当于把当时的状态保存在一个文件里,并把该文件保存到硬盘里,而这个过程就称为序列化。等你完事后回来,取消挂起继续游戏,就相当于把早先保存在硬盘里的文件数据提取了出来,这个过程就是反序列化。
可见,序列化和反序列化的优点有两个:一是便于存储,一是便于传输。
1. 便于存储
序列化过程将文本信息转变为二进制数据流。这样信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,再将其反序列化便可以得到原始的数据。
2. 便于传输
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论何种类型的数据,都会以二进制序列的形式在网络上传送。
JSON函数的应用场景
使用 JSON 函数需要导入 json 库:import json
函数 |
描述 |
json.dumps |
将 Python 对象编码成 JSON 字符串,即把dict类型的数据转换成str类型 |
json.dump |
将Python 对象编码成 JSON 字符串(即把dict类型的数据转成str),并写入到json文件中 |
json.loads |
将已编码的 JSON 字符串解码为 Python 对象,即把str类型的数据转换成dict类型 |
json.load |
从已编码的 JSON 文件中读取数据并反序列化 |
json.dumps
json.dumps 用于将 Python 对象编码成 JSON 字符串。
# 简单编码,将dict类型的数据转成str print(json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])) # ["foo", {"bar": ["baz", null, 1.0, 2]}]
# 参数sort_keys=True可以将字典排序 print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) # {"a": 0, "b": 0, "c": 0}
# 参数separators=('','')可以自定义分隔符 print(json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':'))) # [1,2,3,{"4":5,"6":7}]
# 参数indent可以增加缩进,增强可读性,但缩进空格会使数据变大 print(json.dumps({'4': 5, '6': 7}, sort_keys=True,indent=2, separators=(',', ': '))) # { # "4": 5, # "6": 7 # }
# 参数skipkeys可以忽略非str类型的key。dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型则会抛出TypeError异常,如果开启该参数并设为True,会忽略这个key。 data = {'a':1,(1,2):123} print(json.dumps(data,skipkeys=True)) #{"a": 1}
json.dump
json.dump 用于将Python 对象编码成 JSON 字符串(即把dict类型的数据转成str),并写入到json文件中。
将dict类型对象序列化并保存到文件:
1 import json 2 3 info = { 4 'name':'alex', 5 'age':'22' 6 } 7 8 with open('test.test',"w") as f: 9 json.dump(info,f)
执行代码后,test.test文件内容数据如下:
{"name": "alex", "age": "22"}
json.loads
json.loads 将已编码的 JSON 字符串解码为 Python 对象。
1 import json 2 3 obj = ['foo', {'bar': ('baz', None, 1.0, 2)}] 4 a = json.dumps(obj) # 先序列化 5 print(a) 6 # ["foo", {"bar": ["baz", null, 1.0, 2]}] # JSON 类型 7 8 print(json.loads(a)) # 再反序列化 9 # ['foo', {'bar': ['baz', None, 1.0, 2]}] # Python 类型
json.load
json.loads 用于从已编码的 JSON 文件中读取数据并反序列化。
import json f = open("test.test","r") data= json.load(f) print(data) # {'name': 'alex', 'age': '22'} print(type(data)) # <class 'dict'> # 索引字典中指定key对应的value print(data['age']) # 22
-END-