Python 数据持久化 - JSON 模块



JSON 代表 **JavaScript 对象表示法 (JavaScript Object Notation)**。它是一种轻量级的数据交换格式。它是一种与语言无关且跨平台的文本格式,许多编程语言都支持它。此格式用于 Web 服务器和客户端之间的数据交换。

JSON 格式类似于 pickle。但是,pickle 序列化是 Python 特定的,而 JSON 格式由多种语言实现,因此已成为通用标准。Python 标准库中 json 模块的功能和接口类似于 pickle 和 marshal 模块。

与 pickle 模块一样,json 模块也提供 **dumps()** 和 **loads()** 函数,用于将 Python 对象序列化为 JSON 编码的字符串,以及 **dump()** 和 **load()** 函数,用于将序列化后的 Python 对象写入文件或从文件中读取。

  • **dumps()** − 此函数将对象转换为 JSON 格式。

  • **loads()** − 此函数将 JSON 字符串转换回 Python 对象。

以下示例演示了这些函数的基本用法:

import json
   data=['Rakesh',{'marks':(50,60,70)}]
   s=json.dumps(data)
json.loads(s)

dumps() 函数可以采用可选的 sort_keys 参数。默认情况下,它是 False。如果设置为 True,则字典键将按排序顺序出现在 JSON 字符串中。

dumps() 函数还有一个可选参数,称为 indent,它采用数字作为值。它决定 JSON 字符串格式化表示的每个段的长度,类似于打印输出。

json 模块还具有与上述函数相对应的面向对象 API。模块中定义了两个类 - JSONEncoder 和 JSONDecoder。

JSONEncoder 类

此类的对象是 Python 数据结构的编码器。每个 Python 数据类型都转换为对应的 JSON 类型,如下表所示:

Python JSON
字典 对象
列表,元组 数组
字符串 字符串
整数,浮点数,整数和浮点派生枚举 数字
True true
False false
None null

JSONEncoder 类由 JSONEncoder() 构造函数实例化。编码器类中定义了以下重要方法:

序号 方法和描述
1

encode()

将 Python 对象序列化为 JSON 格式

2

iterencode()

编码对象并返回一个迭代器,该迭代器生成对象中每个项目的编码形式。

3

indent

确定编码字符串的缩进级别

4

sort_keys

为 true 或 false,使键按排序顺序出现或不出现。

5

check_circular

如果为 True,则检查容器类型对象中的循环引用

以下示例对 Python 列表对象进行编码。

e=json.JSONEncoder()
e.encode(data)

JSONDecoder 类

此类的对象有助于将 JSON 字符串解码回 Python 数据结构。此类中的主要方法是 decode()。以下示例代码从前面步骤中的编码字符串中检索 Python 列表对象。

d=json.JSONDecoder()
d.decode(s)

json 模块定义了 **load()** 和 **dump()** 函数,用于将 JSON 数据写入文件类对象(可能是磁盘文件或字节流)并从中读取数据。

dump()

此函数将 JSON 编码的 Python 对象数据写入文件。该文件必须以 'w' 模式打开。

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 对象。该文件必须以读取权限打开(应具有 'r' 模式)。

示例

fp=open('json.txt','r')
   ret=json.load(fp)
   print (ret)
   fp.close()

输出

['Rakesh', {'marks': [50, 60, 70]}]

**json.tool** 模块还具有一个命令行界面,该界面验证文件中的数据并以漂亮的格式化方式打印 JSON 对象。

C:\python37>python -m json.tool json.txt
[
   "Rakesh",   
   {
      "marks": [
         50,
         60,
         70
      ]
   }
]
广告