python 0220 序列化、反序列化

目录

json

小结:

pickle 模块


原文参考https://www.cnblogs.com/yyds/p/6563608.html

json

import json

import demjson as demjson

data = {"a": "str", "c": True, "b": 11.1, "e": 10, "d": None, "g": [4, 5, 6], "f": [1, 2, 3]}
# ddata = json.dumps(data,sort_keys=True, separators=(',', ':'),indent=4)
# ldata = json.loads(str(data)) # 报错,提示要用双引号,因为str()后,结果是k、v都是单引号
# print(ldata)
sddata = json.dumps(str(data))
print(sddata)   # "{'a': 'str', 'c': True, 'b': 11.1, 'e': 10, 'd': None, 'g': [4, 5, 6], 'f': [1, 2, 3]}"

# 如果字符串本身的key、value是单引号,怎么解决
# 方法1行不通,因为json.loads(Json),Json必须使用符合json规则,True为true,None为null
s = str(data).replace("'",'"')
# print(s,type(s))    # {"a": "str", "c": True, "b": 11.1, "e": 10, "d": None, "g": [4, 5, 6], "f": [1, 2, 3]}
# print(json.loads(s))
s1 = '{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}'
print(json.loads(s1))
# 方法2
print(demjson.encode(str(data)))    # "{'a': 'str', 'c': True, 'b': 11.1, 'e': 10, 'd': None, 'g': [4, 5, 6], 'f': [1, 2, 3]# }"

# dump() load()
with open(os.path.join(os.path.dirname(__file__),'test.json'),'w') as fp:
    json.dump({'a': '中国', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g': (4, 5, 6)}, fp,indent=4)

with open(os.path.join(os.path.dirname(__file__),'test.json'),'r') as fp:
    print(json.load(fp))

# encode() decode()
str1 = '中国'
str2 = str1.encode()
str3 = str2.decode()
print(str1,str2,str3)



# 1编写转换函数
def obj2dict(obj):
    d = {}
    # print(obj.__class__.__name__)   # Student
    # print(obj.__module__)   # __main__
    # print(obj.__dict__) # {'sno': 1, 'age': 19, 'name': 'xh'}
    d['__class__'] = obj.__class__.__name__
    d['__module__'] = obj.__module__
    d.update(obj.__dict__) # 添加到指定字典dict里的字典
    return d

def dict2obj(d):
    if '__class__' in d:
        class_name = d.pop('__class__')
        module_name = d.pop('__module__')
        module = __import__(module_name)
        class_ = getattr(module, class_name)
        args = dict((key.encode('ascii'), value) for key, value in d.items())
        instance = class_(**args)
    else:
        instance = d
    return instance

print((obj2dict(stu)))
json.dumps(obj2dict(stu))
print(json.dumps(stu,default=obj2dict)) # default,把obj转化成obj2dict
with open(os.path.join(os.path.dirname(__file__),'test.json'),'w') as fp:
    json.dump(obj2dict(stu),fp,indent=4)

小结:

  1. json.loads(xxx),将json反序列化成python的数据对象,但是使用时,必须确保xxx符合json规则

    1. 例如python True,json是true

    2. k、v要用双引号

  2. json.dumps(xxx),将xxx序列化成json,以便网络传输,或者存储到磁盘文件

  3. json.dump(xxx),将xxx序列化成json,直接网络传输,或者存储到磁盘文件

  4. json.load(xxx),可直接从文件读取json反序列化成python的数据对象

pickle 模块

和json类似,pickle序列化对象:字节流二进制文件或字节对象

方法有:

  1. pickle.dumps(python_obj)
  2. pickle.loads(byte_obj)
  3. pickle.dump(python_obj,file) # 将序列化的二进制字节流写入file
  4. pickle.load(file) # 从file读取二进制字节流并转换成python对象

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值