简单介绍Python中的JSON使用


Posted in Python onApril 28, 2015

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 相关文章推荐
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
python连接mongodb密码认证实例
Oct 16 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
Python collections.deque双边队列原理详解
Oct 05 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
python微信智能AI机器人实现多种支付方式
Apr 12 Python
浅析Python中的序列化存储的方法
Apr 28 #Python
详解在Python和IPython中使用Docker
Apr 28 #Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 #Python
介绍Python中的文档测试模块
Apr 28 #Python
Django中几种重定向方法
Apr 28 #Python
详解Python的单元测试
Apr 28 #Python
Python xlrd读取excel日期类型的2种方法
Apr 28 #Python
You might like
用文本文件制作留言板提示(下)
2006/10/09 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
js实现无缝轮播图
2020/03/09 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Python中的列表知识点汇总
2015/04/14 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
使用python接入微信聊天机器人
2020/03/31 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
会计岗位职责模板
2014/03/12 职场文书
《锄禾》教学反思
2014/04/08 职场文书
个人安全生产承诺书
2014/05/22 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
违反交通法规检讨书
2014/09/10 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS