Python JSON序列化与反序列化详解:处理中文及文件操作

今天早睡
今天早睡
发布时间:2026-10-13| 3人浏览过
原创

本文详解Python中JSON库的序列化与反序列化操作。通过对比不同编程语言的数据类型,阐述JSON作为跨语言数据交换标准的优势。重点讲解json.dumps()与json.loads()方法,特别是利用ensure_ascii=False参数解决中文编码问题。此外,还提供将列表对象序列化为文件及从文件反序列化的完整代码示例,帮助开发者掌握实际工作中的应用技巧。

不同编程语言拥有各自独特的数据类型体系,例如:

Python支持的数据类型包括dict、list、string、int、float、long、bool以及None;Java包含bool、char、byte、short、int、long、float和double;C语言涵盖bit、bool、char、int、short、long、unsigned、double和float;Tcl涉及int、bool、float和string;Ruby则支持Number、String、Ranges、Symbols、true、false、Array和Hash等类型。

尽管各语言类型各异,但它们都具备字符串这一共同基础类型。

为了实现不同编程语言间对象数据的传递,必须将对象序列化为标准格式。虽然XML是一种可选方案,但JSON更为优越,因为JSON本质上即为字符串,能够被所有编程语言解析读取,同时也便于存储至磁盘或通过互联网进行传输。此外,JSON不仅符合标准格式,其解析速度通常快于XML,且能直接在Web页面中读取,使用体验更加便捷。

JSON类型与Python类型的对应关系如下:大括号{}对应dict,方括号[]对应list,双引号包裹的字符串"string"对应str,数值1234.56对应int或float,布尔值true对应True,false对应False,null对应None。

在Python语境下,序列化是指将Python对象编码转换为JSON格式的字符串;反序列化则是将JSON字符串解码还原为Python数据对象。Python标准库中专门提供了json库和pickle库来处理这两类序列化需求。

json模块中的dumps和loads方法分别用于数据的序列化和反序列化。具体而言,dumps方法可将Python数据结构转换为JSON格式的字符串;loads方法则执行相反操作,将JSON字符串转换为对应的Python数据类型。需要注意的是,默认情况下dumps函数会将中文字符转换为Unicode编码序列,若需保留中文原貌,可在调用dumps函数时添加ensure_ascii=False参数。

以下是JSON序列化与反序列化的具体演示:

1、JSON序列化示例:

import json
print (json.__all__)  #查看json库的所有方法
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

若未在dumps函数中指定ensure_ascii=False参数,输出结果如下:

#coding: utf-8
import json
dict = {'name':'zhangsan', 'age':33, 'address':'红星路'}
print('未序列化前的数据类型为:', type(dict))
print('为序列化前的数据:', dict)
#对dict进行序列化的处理
dict_xu = json.dumps(dict)  #直接进行序列化
print('序列化后的数据类型为:', type(dict_xu))
print('序列化后的数据为:', dict_xu)

序列化前的数据类型显示为<class 'dict'>,原始数据内容为{'name': 'zhangsan', 'address': '红星路', 'age': 33}。序列化后数据类型变为<class 'str'>,生成的字符串内容为{"name": "zhangsan", "address": "\u7ea2\u661f\u8def", "age": 33},其中中文地址被转换为Unicode编码。

若在dumps函数中显式添加参数ensure_ascii=False,输出结果如下:

#coding: utf-8
import json

dict = {'name':'zhangsan', 'age':33, 'address':'红星路'}
print('未序列化前的数据类型为:', type(dict))
print('为序列化前的数据:', dict)
#对dict进行序列化的处理
dict_xu = json.dumps(dict,ensure_ascii=False)  #添加ensure_ascii=False进行序列化
print('序列化后的数据类型为:', type(dict_xu))
print('序列化后的数据为:', dict_xu)

序列化前的数据类型仍为<class 'dict'>,原始数据内容为{'address': '红星路', 'age': 33, 'name': 'zhangsan'}。序列化后数据类型变为<class 'str'>,此时生成的字符串内容为{"address": "红星路", "age": 33, "name': 'zhangsan'},中文字符得以正常显示。

2、JSON反序列化示例:

#coding: utf-8
import json
dict = {'name':'zhangsan', 'age':33, 'address':'红星路'}
print('未序列化前的数据类型为:', type(dict))
print('为序列化前的数据:', dict)
#对dict进行序列化的处理
dict_xu = json.dumps(dict,ensure_ascii=False)  #添加ensure_ascii=False进行序列化
print('序列化后的数据类型为:', type(dict_xu))
print('序列化后的数据为:', dict_xu)
#对dict_xu进行反序列化处理
dict_fan = json.loads(dict_xu)
print('反序列化后的数据类型为:', type(dict_fan))
print('反序列化后的数据为: ', dict_fan)

序列化前的数据类型为<class 'dict'>,原始数据为{'name': 'zhangsan', 'age': 33, 'address': '红星路'}。经过序列化处理后,数据类型变为<class 'str'>,字符串内容为{"name": "zhangsan", "age": 33, "address": "红星路"}。随后进行反序列化操作,最终数据类型恢复为<class 'dict'>,数据内容还原为{'name': 'zhangsan', 'age': 33, 'address': '红星路'}。

在实际工程应用中,序列化或反序列化的对象往往以文件形式存在,而非简单的内存变量。因此,需要实现文件内容的序列化与反序列化功能。首先展示序列化代码,主要包含两个步骤:第一步是对列表对象进行序列化,第二步是将序列化生成的字符串写入文件。

#coding: utf-8
import json

list = ['Apple','Huawei','selenium','java','python']
#把list先序列化,写入到一个文件中
# 两步操作 1步先序列化 列表对象 2步把序列化成的字符串写入文件
json.dump(list, open('e:/test.txt','w'))  
r1=open('e:/test.txt','r')
print(r1.read())

示例列表数据为["Apple", "Huawei", "selenium", "java", "python"]。

反序列化过程同样包含两个步骤:第一步是读取文件中的字符串内容,第二步是将该字符串反序列化为列表对象。

#coding: utf-8
import json

list = ['Apple','Huawei','selenium','java','python']
#把list先序列化,写入到一个文件中
# 两步操作 1步先序列化 列表对象 2步把序列化成的字符串写入文件
json.dump(list, open('e:/test.txt','w'))  
r1=open('e:/test.txt','r')
print(r1.read())
#------------------------------------------------------------
#两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象
res=json.load(open('e:/test.txt','r'))
print (res)
print('数据类型:',type(res))

文件读取结果显示为["Apple", "Huawei", "selenium", "java", "python"],经反序列化后得到列表['Apple', 'Huawei', 'selenium', 'java', 'python'],其数据类型确认为<class 'list'>。

以上内容涵盖了Python JSON序列化与反序列化的核心知识点,希望对读者有所帮助,欢迎继续支持本站获取更多技术资源。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。