- 序列化:把不可传输的对象转换成可存储或可传输的过程
- 反序列化:把磁盘等介质中的数据转换成对象
序列化:dump(object)和dumps(object)
反序列化:load(bytes)和loads(bytes)
不带s的是(反)序列化二进制文件,带s的是(反)序列化对象
1. dumps()和loads()对对象进行存储
>>> import pickle
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> b = pickle.dumps(dict1)
>>> b
b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02X\x01\x00\x00\x00cq\x03K\x03u.'
>>> type(b)
>>> c = pickle.loads(b)
>>> c
{'a': 1, 'b': 2, 'c': 3}
>>> type(c)
2. dump()和load()对文件进行操作,由于pickle写入的二进制数据,所以打开方式需要以"wb"和"rb"的模式
>>> import pickle
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> file1 = open('test.txt', 'wb')
>>> pickle.dump(dict1, file1)
>>> file1.close()
>>> file2 = open('test.txt', 'rb')
>>> file2
<_io.BufferedReader name='test.txt'>
>>> pickle.load(file2)
{'a': 1, 'b': 2, 'c': 3}
>>> file2.close()
>>> id(file1)
1822579928584
>>> id(file2)
1822579928936
注意:结果说明反序列化后的对象不是原来的对象了
1. python转json
python | JSON |
---|---|
dict | object |
list / tuple | array |
str | string |
int / float / enums | numbers |
None | null |
True | true |
False | false |
2. json转python
JSON | python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(rel) | float |
true | True |
false | False |
null | None |
3. 说明
- Python dict中的非字符串key被转换成JSON字符串时都会被转换为小写字符串;
- Python中的tuple,在序列化时会被转换为array,但是反序列化时,array会被转化为list;
- 由以上两点可知,当Python对象中包含tuple数据或者包含dict,且dict中存在非字符串的key时,反序列化后得到的结果与原来的Python对象是不一致的;
- 对于Python内置的数据类型(如:str, unicode, int, float, bool, None, list, tuple, dict)json模块可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。
4. 使用方式
json.dumps :从字典(可序列化json的对象)转换为json格式数据
json.loads :从json格式数据转到python字典类型
json.dump : 将json格式的字符串写入到文件中
json.load :从文件中读取字符串参数:default :就是把任意一个对象变成一个可序列化的json对象
intent:自定义格式化
不带s的是file文件中使用的
5. 序列化字符串
>>> import json
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> a = json.dumps(dict1)
>>> a
'{"a": 1, "b": 2, "c": 3}'
>>> b = json.loads(a)
>>> b
{'a': 1, 'b': 2, 'c': 3}
>>> type(a)
>>> type(b)
>>> a = json.dumps(dict1, indent=3)
>>> a
'{\n "a": 1,\n "b": 2,\n "c": 3\n}'
>>>
现在我们想序列化一个类,如下使用相同的json.dumps(ball)序列化下面ball的对象会出现以下错误
TypeError: Object of type 'Ball' is not JSON serializable
正确的处理方法要把对象转换为可序列化json的对象,所以要使用关键字参数default和定义一个转换函数去处理
class Ball:
def __init__(self, color):
self.color = color
ball = Ball("red")
def ball2idict(bal):
return {
"color": bal.color
}
def dict2ball(odict):
return Ball(odict["color"])
objdumps = json.dumps(ball, default=ball2idict)
objloads = json.loads(objdumps, object_hook=dict2ball)
print(objdumps)# 1
print(objloads)# 2
输出结果:
1 {"color": "red"}
2 <__main__.Ball object at 0x0000025DCDDD2630>
6. 存储为json文件
In [4]: content = {'name': '张飞', 'age': 20}
In [5]: with open('test.txt', 'w', encoding='utf-8') as f:
...: json.dump(content, f)
...:
In [6]: with open('test.txt', 'r', encoding='utf-8') as f:
...: data = json.load(f)
...: print(data)
...:
...:
{'name': '张飞', 'age': 20}
In [7]: data
Out[7]: {'name': '张飞', 'age': 20}
In [8]: type(data)
Out[8]: dict