序列化

序列化


什么是序列化

得到一个序列的结果(字符串)

字典/列表/数字/对象 ---序列化 ->字符串


为什么要序列化

  1. 要把内容写入文件需要使用序列化
  2. 网络传输数据时候需要用到序列化

什么是反序列化

字符串 -> 反序列化 -> 字典/列表/数字/对象


序列化方法


json

import json

序列化


序列化字典

dic = {"aaa": 'bbb', 'ccc':'ddd'}
print(dic, type(dic))

输出结果

{'aaa': 'bbb', 'ccc': 'ddd'} <class 'dict'>

说明: 可以观察到, 虽然字典的key aaa是用双引号, 但是输出的时候显示的是单引号;

python的数据字符串输出都是用单引号, 只有json格式的数据才是双引号


str_dic = json.dumps(dic)
print(str_dic, type(str_dic))

输出结果

{"aaa": "bbb", "ccc": "ddd"} <class 'str'>

说明: 可以观察到, 这是个字符串, 而且里面的字符串都是用双引号引起来的, 表示已经由json序列化成功


写数据到文件

方法1

with open('json_dump', 'w') as f:
    f.write(str_dic)


方法2

with open('json_dump2', 'w') as f:
    json.dump(dic, f)


反序列化


反序列化由字典序列化成的json字符串

ret = json.loads(str_dic)
print(ret, type(ret))

输出结果

{'aaa': 'bbb', 'ccc': 'ddd'} <class 'dict'>

读取文件

with open('json_dump2') as f:
    res = json.load(f)
    print(res, type(res))

输出结果

{'aaa': 'bbb', 'ccc': 'ddd'} <class 'dict'>

json高级


限制1

json格式的key必须是字符串数据类型, 如果是数字为key, 那么dumps之后会强行转换成字符串数据类型


dic = {1: 2, 3: 4}
print(dic, type(dic))

输出结果

{1: 2, 3: 4} <class 'dict'>

序列化

str_dic = json.dumps(dic)
print(str_dic, type(str_dic))

输出结果

{"1": 2, "3": 4} <class 'str'>

反序列化

new_dic = json.loads(str_dic)
print(new_dic, type(new_dic))

输出结果

{'1': 2, '3': 4} <class 'dict'>

限制2

json对元组做value的字典会把元组强制转换成列表


dic = {'abc': (1, 2, 3)}
print(dic, type(dic))

输出结果

{'abc': (1, 2, 3)} <class 'dict'>

序列化

str_dic = json.dumps(dic)
print(str_dic, type(str_dic))

输出结果

{"abc": [1, 2, 3]} <class 'str'>

反序列化

new_dic = json.loads(str_dic)
print(new_dic, type(new_dic))
print(new_dic['abc'], type(new_dic['abc']))

输出结果

{'abc': [1, 2, 3]} <class 'dict'>
[1, 2, 3] <class 'list'>

限制3

json不支持元组做key

dic = {(1, 2, 3): 'abc'}
str_dic = json.dumps(dic)

输出结果

TypeError: keys must be a string

限制4

json中的字符串只能是双引号



pickle


shelve

原文地址:https://www.cnblogs.com/cjwnb/p/11863696.html