Python中JSON模块的序列化与反序列化(第5节)


上一节我们已经介绍了,Pickle模块可以实现了基本的数据序列化和反序列化功能,但是Pickle模块仅支持Python编程语言。如果要在不同的编程语言之间传递数据对象,可以使用Python的JSON模块对数据进行序列化和反序列化,JSON序列化后所有数据都被表示成字符串形式,可以被所有编程语言读取,也可以方便地存储到磁盘或者通过网络数据传输。

1、JSON模块

对于经常使用Python开发程序的人员来说,Python的JSON序列化和反序列化功能非常方便和实用。JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式,易于人类阅读和编写,同时JSON数据可以很容易地解析为程序可用的数据结构。JSON是基于JavaScript语言的一个子集,但已成为跨编程语言和平台的通用数据格式,可以实现任何编程语言之间跨平台的数据交换。

JSON数据类型是由键值对组成,看起来非常像Python中的字典或JavaScript中的对象。它支持以下数据类型:

字符串(String): 表示文本数据,使用双引号括起来,注意不能用单引号。

数字(Number): 表示整数(int)或浮点数(float)。

布尔值(Boolean): 表示真(true)或假(false),注意都是小写。

数组(Array): 表示有序的值列表,使用方括号括起来,值之间用逗号分隔。

对象(Object): 表示键值对集合,使用花括号括起来,键和值之间用冒号分隔,键值对之间用逗号分隔。

以下是一个简单的JSON示例:

{
  "name": "张三",
  "age": 30,
  "city": "上海",
  "hobbies": ["旅游", "钓鱼"],
  "isStudent": true
}

Python数据类型和JSON数据类型转换对照表如下:

Python数据类型 JSON数据类型
int int
float float
bool(True,False) bool(true,false)
None null
str string(必须双引号)
list([])、tuple(()) Array([])
dict({}) Object({})(键必须是双引号)

json模块的序列化和pickle模块类似,函数名称和使用方法基本一样,但是pickle可以序列化Python所有的数据类型,而json模块只允许对象、数组、字符串、数字、布尔值和null这六种类型的数据进行序列化和反序列化。

下面我们使用json模块序列化Python字典,利用json.dumps()方法将Python字典转换为JSON格式的字符串。

动手练一练:

import json

person = {
  "name": "张三",
  "age": 30,
  "city": "上海",
  "hobbies": "旅游"
}
print(json.dumps(person))

执行以上代码,输出结果为:

{"name": "\u5f20\u4e09", "age": 30, "city": "\u4e0a\u6d77", "hobbies": "\u65c5\u6e38"}

这里需要注意的是,上面的例子中json模块会自动把中文转码为Unicode编码‌Unicode编码‌是一种计算机编码标准,旨在为世界上大多数书写系统中的每个字符提供一个唯一的数字编码,从而统一每一个传统字符的编码。说通俗点就是它按照某个规则给每个字符都分配了一个数字编号(比如:'A'的编号为65或0x0041,'万'的编号为19981或0x4e0d),相当于是一个编号库,这个数字编号也叫Unicode码。

和pickle模块类似,json模块的dump()方法可以直接把Python字典序列化为文件对象并存入到磁盘文件中,例如:

动手练一练:

import json

person = {
  "name": "张三",
  "age": 30,
  "city": "上海",
  "hobbies": "旅游"
}
with open("E:\\Pyhint\\Learn-Python\\test\\data.txt", "w") as a:
    json.dump(person, a)

执行以上代码,同样会在“E:\Pyhint\Learn-Python\test”文件夹下面生成data.txt文件。当我们双击打开data.txt文件时,会看到里面的内容和前面的例子中打印出来的结果完全相同。

和pickle模块类似,我们可以使用json.loads()方法反序列化,将json字符串解码成Python字典。例如:

动手练一练:

import json

a = open("E:\\Pyhint\\Learn-Python\\test\\data.txt", "r")
data = a.read()
b = json.loads(data)
a.close()
print(b)

执行以上代码,输出结果为:

{'name': '张三', 'age': 30, 'city': '上海', 'hobbies': '旅游'}

上面的例子中,json.loads()方法成功把json格式的字符串解码成Python字典,而且其中的Unicode编码会自动解析成中文。但是这里需要注意的是,json反序列化只能应用在使用json序列化的数据上,不能反序列化pickle模块序列化后的二进制bytes数据。如果提供的json数据无效,解析过程将引发JSONDecodeError异常。

和pickle模块一样,我们可以利用json.load()方法直接从文件对象中读取内容,例如:

动手练一练:

import json

with open("E:\\Pyhint\\Learn-Python\\test\\data.txt", "r") as a:
    b = json.load(a)
    print(b)

执行以上代码,输出结果为:

{'name': '张三', 'age': 30, 'city': '上海', 'hobbies': '旅游'}

2、json模块与pickle模块的差异

json模块和pickle模块都是实现Python对象序列化和反序列化的模块,虽然他们都提供dumps()、dump()、loads()、load()四个同样的方法,但两个模块之间存在根本上的差异。

JSON是一种文本序列化格式,而pickle是一种二进制bytes序列化格式。

JSON是人类可读且易于阅读和编写的,而pickle人类不可读。

JSON相当于编程界的普通话,且在Python编程语言之外被广泛使用。因为JSON表示出来就是一个字符串,可以被所有编程语言读取,通过JSON,可以实现跨平台,不同编程语言之间的数据交互;而pickle只能用于Python系统内部。

3、JSON的应用场景

JSON广泛应用于各种场景,包括:

Web API接口设计:作为Web服务的数据交换格式,客户端和服务器之间经常使用JSON进行通信。通过JSON,Web应用程序可以请求和响应数据。

配置文件:JSON也常用于编写配置文件,定义程序的属性和参数,便于修改和管理。

前后端数据交互:JSON常用于Web应用程序中,前端页面可以通过AJAX技术向后端服务器发送请求,获取JSON格式的数据,然后使用JavaScript解析这些数据,用于动态页面渲染和数据交互。

数据存储:JSON可以序列化为文本格式,用于本地文件或数据库中的存储,便于后续的读取、修改和删除操作,常用于存储和处理应用程序的配置信息、用户数据、日志信息等。

总之,JSON的应用场景非常广泛,几乎涵盖了Web开发和数据交换的各个方面。