Python学习----IO编程
2015-09-14 23:13
691 查看
一、序列化
JSON进阶Python的
dict对象可以直接序列化为JSON的
{},不过,很多时候,我们更喜欢用
class表示对象,比如定义
Member类,然后序列化:
import json class Member(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score m = Member('James', 24, 80) print(json.dumps(m))
运行代码,出现错误
TypeError:
Traceback (most recent call last): ... TypeError: <__main__.Member object at 0x10603cc50> is not JSON serializable
错误的原因是
Member对象不是一个可序列化为JSON的对象。
如果连
class的实例对象都无法序列化为JSON,这肯定不合理!
我们仔细看看
dumps()方法的参数列表,可以发现,除了第一个必须的
obj参数外,
dumps()方法还提供了一大堆的可选参数:
https://docs.python.org/3/library/json.html#json.dumps
这些可选参数就是让我们来定制JSON序列化。前面的代码之所以无法把
Member类实例序列化为JSON,是因为默认情况下,
dumps()方法不知道如何将
Member实例变为一个JSON的
{}对象。
可选参数
default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为
Member专门写一个转换函数,再把函数传进去即可:
def member2dict(mem): return { 'name': mem.name, 'age': mem.age, 'score': mem.score }
这样,
Member实例首先被
member2dict()函数转换成
dict,然后再被顺利序列化为JSON:
>>> print(json.dumps(s, default=member2dict)) {"age": 24, "name": "James", "score": 80}
不过,下次如果遇到一个
Worker类的实例,照样无法序列化为JSON。我们可以偷个懒,把任意
class的实例变为
dict:
print(json.dumps(s, default=lambda obj: obj.__dict__))
因为通常
class的实例都有一个
__dict__属性,它就是一个
dict,用来存储实例变量。也有少数例外,比如定义了
__slots__的class。
同样的道理,如果我们要把JSON反序列化为一个
Member对象实例,
loads()方法首先转换出一个
dict对象,然后,我们传入的
object_hook函数负责把
dict转换为
Student实例:
def dict2member(d): return Member(d['name'], d['age'], d['score'])
运行结果如下:
>>> json_str = '{"age": 24, "score": 80, "name": "James"}' >>> print(json.loads(json_str, object_hook=dict2member)) <__main__.Membert object at 0x10cd3c190>
打印出的是反序列化的
Member实例对象。
(1)Python语言特定的序列化模块是
pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用
json模块。
(2)
json模块的
dumps()和
loads()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。
相关文章推荐
- Spark编程指南(python版)
- python进程池剖析(三)
- enumerate函数解析
- zip函数解析
- range解析
- python简单爬虫(二)
- python math模块
- Python+OpenCV学习(12)---特征匹配
- python学习——fnmatch
- python核心编程第4章课后题答案(第二版75页)
- [Python]通过网易财经接口获取股票和指数的历史数据
- python核心编程第3章课后题答案(第二版55页)
- Python Regular Expression
- python核心编程第2章课后题答案(第二版36页)
- python_docx
- 为什么python在函数中修改"字典型全局变量"不需要global
- 6 Easy Steps to Learn Naive Bayes Algorithm (with code in Python)
- Hive中使用python
- 创Python规划2
- python图片简易二值化