Python JSON操作
JSON代表JavaScript对象表示法。它是一种轻量级数据交换格式。它类似于pickle。然而,pickle系列化是特定于Python的,而JSON格式由多种语言实现。Python标准库中的json模块实现了类似pickle和marshal模块的对象序列化功能。
就像pickle模块一样,json模块还提供了dumps()和loads()函数,用于将Python对象序列化为JSON编码的字符串,以及dump()和load()函数,用于将序列化的Python对象写入和读取到/自文件中。
- dumps() - 该函数将对象转换为JSON格式。
-
loads() - 该函数将JSON字符串转换回Python对象。
下面的示例演示了这些函数的基本用法:
示例1
import json
data=['Rakesh',{'marks':(50,60,70)}]
s=json.dumps(data)
print (s, type(s))
data = json.loads(s)
print (data, type(data))
它将产生以下 输出 −
["Rakesh", {"marks": [50, 60, 70]}] <class 'str'>
['Rakesh', {'marks': [50, 60, 70]}] <class 'list'>
dumps()函数可以带有可选的sort_keys参数。默认情况下为False。如果设置为True,则字典键将按照排序的顺序出现在JSON字符串中。
data=['Rakesh',{'marks':(50,60,70)}]
s=json.dumps(data, sort_keys=True)
示例2
dumps()函数有另一个可选参数叫做 indent ,它接受一个数字作为值。它决定了格式化json字符串的每个段落的长度,类似于pprint输出。
import json
data=['Rakesh',{'marks':(50,60,70)}]
s=json.dumps(data, indent = 2)
print (s)
它将生成以下输出−
[
"Rakesh",
{
"marks": [
50,
60,
70
]
}
]
json模块还有与上述函数对应的面向对象API。在该模块中定义了两个类——JSONEncoder和JSONDecoder。
JSONEncoder类
这个类的对象是用于Python数据结构的编码器。每种Python数据类型都会被转换为相应的JSON类型,如下表所示:
Python | JSON |
---|---|
字典 | 对象 |
列表,元组 | 数组 |
字符串 | 字符串 |
整数,浮点数,整数和浮点数衍生的枚举 | 数字 |
真 | 真 |
假 | 假 |
空 | 空 |
JSONEncoder类由JSONEncoder()构造函数实例化。以下重要方法在编码器类中定义:
- encode() - 将Python对象序列化为JSON格式。
-
iterencode() - 编码对象并返回一个迭代器,该迭代器产生对象中每个项的编码形式。
-
indent - 确定编码字符串的缩进级别。
-
sort_keys - 如果为true,则按排序顺序显示键;如果为false,则不排序。
-
check_circular - 如果为True,则检查容器类型对象中的循环引用。
以下示例对Python列表对象进行编码。
示例
import json
data=['Rakesh',{'marks':(50,60,70)}]
e=json.JSONEncoder()
使用iterencode()方法,编码字符串的每个部分显示如下-
import json
data=['Rakesh',{'marks':(50,60,70)}]
e=json.JSONEncoder()
for obj in e.iterencode(data):
print (obj)
它将生成以下输出−
["Rakesh"
,
{
"marks"
:
[50
, 60
, 70
]
}
]
JSON解码器类
这个类的对象帮助将JSON字符串解码回Python数据结构。这个类的主要方法是decode()。下面的示例代码从之前步骤中的编码字符串中检索Python列表对象。
示例
import json
data=['Rakesh',{'marks':(50,60,70)}]
e=json.JSONEncoder()
s = e.encode(data)
d=json.JSONDecoder()
obj = d.decode(s)
print (obj, type(obj))
将产生以下 输出 −
['Rakesh', {'marks': [50, 60, 70]}] <class 'list'>
带有文件/流的JSON
json模块定义了load()和dump()函数,用于将JSON数据写入文件对象中 – 它可以是磁盘文件或字节流,并从中读取数据。
dump()函数
该函数将Python对象数据编码为JSON格式,并将其写入文件中。文件必须具有写入权限。
示例
import json
data=['Rakesh', {'marks': (50, 60, 70)}]
fp=open('json.txt','w')
json.dump(data,fp)
fp.close()
这段代码将在当前目录中创建’json.txt’文件。它显示的内容如下 –
["Rakesh", {"marks": [50, 60, 70]}]
load()函数
该函数从文件中加载JSON数据并将其构建成Python对象。文件必须以读取权限打开。
示例
import json
fp=open('json.txt','r')
ret=json.load(fp)
print (ret)