>>> import pickle >>> p_dict = {'name':'张三' , 'age':30 , 'isMarried':False} # 定义一个字典 >>> import json >>> p_dict = {'name':'张三' , 'age':30 , 'isMarried':False} # 定义一个字典 >>> p_str = json.dumps(p_dict) >>> type(p_str) <class 'str'> >>> p_str '{"name": "\\u5f20\\u4e09", "age": 30, "isMarried": false}'
可以看到,json序列化之后得到的是json格式字符串,但上述json字符串中,中文部分内容显示为了“乱码”。怎么办呢?json的dumps()函数(dump()函数也有)中提供了一个ensure_ascii参数,将该参数的值设置为False,可令序列化后中文依然正常显示。
>>> p_str2 = json.dumps(p_dict, ensure_ascii=False) >>> p_str2 '{"name": "张三", "age": 30, "isMarried": false}'
接着上面的内容进行反序列化:
>>> p1 = json.loads(p_str) >>> p1 {'name': '张三', 'age': 30, 'isMarried': False} >>> p2 = json.loads(p_str) >>> p2 {'name': '张三', 'age': 30, 'isMarried': False}
3.2 dump()与load()>>> import json >>> p_dict = {'name':'张三' , 'age':30 , 'isMarried':False} # 定义一个字典 >>> file = open('d:/mydump.txt' , 'w') >>> json.dump(p_dict , file) >>> file.close()
当然,你也可以加上ensure_ascii这一参数,并将其值设置为False,这样你打开mydump.txt文件里面的中文就能正常显示。(执行完代码之后,本地会有一个mydump.txt文件,诸位可以验证该内容)
>>> file = open('d:/mydump.txt' , 'w') >>> json.dump(p_dict , file , ensure_ascii=False) >>> file.close()
继续反序列化:
>>> file = open('d:/mydump.txt' , 'r') >>> p = json.load(file) >>> file.close() >>> type(p) <class 'dict'> >>> p {'name': '张三', 'age': 30, 'isMarried': False}
通过上面内容,pickle和json模块关于序列化与反序列化的操作就介绍完了。我们可以发现,pickle与json两个模块无论是在函数名,还是在功能上,都是机器相似的。既然这样,有了pickle模块,为什么还有json模块的诞生呢?接下来来说说pickle与json模块的区别。
4 pickle模块与json模块的区别(1)pickle模块用于Python语言特有的类型和用户自定义类型与Python基本数据类型之间的转换
json模块用于字符串和python数据类型间进行转换。如下所示,我们自定义一个Person类,分别用pickle和json进行序列化:
>>> class Person: def __init__(self , name , age , isMarried): self.name = name self.age = age self.isMarried = isMarried >>> p = Person('张三' , 30 , False)
使用pickle模块进行序列化与反序列化: