Python JSON序列化与反序列化详解:处理中文及文件操作
本文详解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序列化与反序列化的核心知识点,希望对读者有所帮助,欢迎继续支持本站获取更多技术资源。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













