JSON进阶

Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:

import json

class Student(object):

def __init__(self, name, age, score):

self.name = name

self.age = age

self.score = score

s = Student('Bob', 20, 88)

print(json.dumps(s))

运行代码,毫不留情地得到一个TypeError:

Traceback (most recent call last):

...

TypeError: <__main__.Student object at 0x10aabef50> is not JSON serializable

错误的原因是Student对象不是一个可序列化为JSON的对象。

如果连class的实例对象都无法序列化为JSON,这肯定不合理!

别急,我们仔细看看dumps()方法的参数列表,可以发现,除了第一个必须的obj参数外,dumps()方法还提供了一大堆的可选参数:

https://docs.python.org/2/library/json.html#json.dumps

这些可选参数就是让我们来定制JSON序列化。前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps()方法不知道如何将Student实例变为一个JSON的{}对象。

可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可:

def student2dict(std):

return {

'name': std.name,

'age': std.age,

'score': std.score

}

print(json.dumps(s, default=student2dict))

这样,Student实例首先被student2dict()函数转换成dict,然后再被顺利序列化为JSON。

不过,下次如果遇到一个Teacher类的实例,照样无法序列化为JSON。我们可以偷个懒,把任意class的实例变为dict:

print(json.dumps(s, default=lambda obj: obj.__dict__))

因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。也有少数例外,比如定义了__slots__的class。

同样的道理,如果我们要把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例:

def dict2student(d):

return Student(d['name'], d['age'], d['score'])

json_str = '{"age": 20, "score": 88, "name": "Bob"}'

print(json.loads(json_str, object_hook=dict2student))

运行结果如下:

<__main__.Student object at 0x10cd3c190>

打印出的是反序列化的Student实例对象。

小结

Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

json模块的dumps()和loads()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。

python中的json_简单介绍Python中的JSON使用相关推荐

  1. python中len用法_简单介绍Python中的len()函数的使用

    简单介绍Python中的len()函数的使用 函数:len() 1:作用:返回字符串.列表.字典.元组等长度 2:语法:len(str) 3:参数:str:要计算的字符串.列表.字典.元组等 4:返回 ...

  2. 简述python中的几种数据类型,简单介绍Python中的几种数据类型

    简单介绍Python中的几种数据类型 python 里面分为 基本数据类型 和 复合数据类型 基本数据类型包括:数值 字符串 布尔 和 none 复合数据类型包括:列表 元组 字典 和集合怎么算是深情 ...

  3. django中使用celery简单介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery im ...

  4. php枚举属于什么类型,python枚举类型是什么?python枚举类型的简单介绍

    本篇文章给大家带来的内容是关于python枚举类型是什么?python枚举类型的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:枚举类型的定义 二:枚举类和普通类的区别 ...

  5. 简单介绍Java中Comparable和Comparator

    转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...

  6. 《看漫画学python》第1章介绍python的历史和特点

    30年前,第一个Python编译器问世,标志着Python的第一个版本正式诞生. 30年后,Python成为了名副其实的最受欢迎程序设计语言之一,甚至在中小学里也掀起了Python狂潮. 经过30年的 ...

  7. 简单介绍Python中的几种数据类型

    大体上把Python中的数据类型分为如下几类: Number(数字) 包括int,long,float,complex String(字符串) 例如:hello,"hello",h ...

  8. 转载:简单介绍Python中的try和finally和with方法

    用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...

  9. python协程异步原理_简单介绍Python的Tornado框架中的协程异步实现原理

    Tornado 4.0 已经发布了很长一段时间了, 新版本广泛的应用了协程(Future)特性. 我们目前已经将 Tornado 升级到最新版本, 而且也大量的使用协程特性. 很长时间没有更新博客, ...

最新文章

  1. Nat. Mach. Intell. | 集成深度学习在生物信息学中的发展与展望
  2. CSS属性中Display与Visibility
  3. LOOPS HDU - 3853 (概率dp):(希望通过该文章梳理自己的式子推导)
  4. 轻芒王俊煜:我是如何设计信息流的?
  5. OpenCV改变图像的对比度和亮度
  6. 【H264/AVC 句法和语义详解】(五):Exp-Golomb指数哥伦布编码(理论篇)
  7. ubuntu创建新用户并设置sudo权限
  8. PMP读书笔记(第9章)
  9. jclasslib查看字节码
  10. 知网又火了!续订费近千万且连年上涨 中科院:不堪重负 停用
  11. 搭建高可用的分布式hadoop2.5.2集群  HDFS HA
  12. iOS底层探索之Runtime(二): objc_msgSend汇编快速查找分析
  13. 设置jupyter notebook默认浏览器
  14. 多台路由器堆叠_双网多网叠加教程
  15. 星加坡php开发_新加坡樟宜机场新地标-星耀樟宜 | 贝诺Benoy
  16. 平板触控笔要原装的吗?开学季必备电容笔推荐
  17. 龙之谷2微信哪个服务器,龙之谷2微信区
  18. PHP单例模式 构造方法
  19. MAC下使用 XMAPP 配置 php 环境
  20. 深度学习笔记(十一)—— 完整性检查[Sanity Checks]

热门文章

  1. Python字典循环与字典排序
  2. Numpy中stack(),hstack(),vstack()函数详解
  3. html5实现贪吃蛇,分享一个用html5实现的贪吃蛇特效代码
  4. html隐藏元素的方式,Web前端:CSS3——3种隐藏元素方法的区别
  5. C语言如何获取文件大小?fseek() + ftell()
  6. hover如何改变子元素或其他同级元素?(用不了怎么回事?)
  7. margin和padding分别适合什么场景使用?
  8. python PyQt5 sizeHint()
  9. python multiprocessing 进程间如何共享数据、对象
  10. python 计时器 timeit 报错:ValueError: stmt is neither a string nor callable