Python json 错误xx is not JSON serializable解决办法


Posted in Python onMarch 15, 2017

Python json 错误xx is not JSON serializable解决办法

在使用json的时候经常会遇到xxx  is not JSON serializable,也就是无法序列化某些对象。经常使用django的同学知道django里面有个自带的Encoder来序列化时间等常用的对象。其实我们可以自己定定义对特定类型的对象的序列化,下面看下怎么定义和使用的。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#json_extention 
#2014-03-16 
#copyright: orangleliu 
#license: BSD 
 
''''' 
python中dumps方法很好用,可以直接把我们的dict直接序列化为json对象 
但是有的时候我们加了一些自定义的类就没法序列化了,这个时候需要 
自定义一些序列化方法 
 
参考: 
http://docs.python.org/2.7/library/json.html 
 
例如: 
In [3]: from datetime import datetime 
 
In [4]: json_1 = {'num':1112, 'date':datetime.now()} 
 
In [5]: import json 
 
In [6]: json.dumps(json_1) 
--------------------------------------------------------------------------- 
TypeError                 Traceback (most recent call last) 
D:\devsofts\python2.7\lib\site-packages\django\core\management\commands\shell.py 
c in <module>() 
----> 1 json.dumps(json_1) 
 
TypeError: datetime.datetime(2014, 3, 16, 13, 47, 37, 353000) is not JSON serial 
izable 
''' 
 
from datetime import datetime 
import json 
 
class DateEncoder(json.JSONEncoder ): 
  def default(self, obj): 
    if isinstance(obj, datetime): 
      return obj.__str__() 
    return json.JSONEncoder.default(self, obj) 
 
json_1 = {'num':1112, 'date':datetime.now()} 
print json.dumps(json_1, cls=DateEncoder) 
 
''''' 
输出结果: 
 
PS D:\code\python\python_abc> python .\json_extention.py 
{"date": "2014-03-16 13:56:39.003000", "num": 1112} 
''' 
 
#我们自定义一个类试试 
class User(object): 
  def __init__(self, name): 
    self.name = name 
 
class UserEncoder(json.JSONEncoder): 
  def default(self, obj): 
    if isinstance(obj, User): 
      return obj.name 
    return json.JSONEncoder.default(self, obj) 
 
json_2 = {'user':User('orangle')} 
print json.dumps(json_2, cls=UserEncoder) 
 
''''' 
PS D:\code\python\python_abc> python .\json_extention.py 
{"date": "2014-03-16 14:01:46.738000", "num": 1112} 
{"user": "orangle"} 
 
'''

定义处理方法是继承json.JSONEncoder的一个子类,使用的时候是在dumps方法的cls函数中添加自定义的处理方法。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python中利用函数装饰器实现备忘功能
Mar 30 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
pycharm中显示CSS提示的知识点总结
Jul 29 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
pyinstaller还原python代码过程图解
Jan 08 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Django自定义YamlField实现过程解析
Nov 11 Python
200行自定义python异步非阻塞Web框架
Mar 15 #Python
Python实现简易端口扫描器代码实例
Mar 15 #Python
Python使用sftp实现上传和下载功能(实例代码)
Mar 14 #Python
Python实现Youku视频批量下载功能
Mar 14 #Python
Python实现视频下载功能
Mar 14 #Python
python 实现自动远程登陆scp文件实例代码
Mar 13 #Python
python executemany的使用及注意事项
Mar 13 #Python
You might like
德生PL330的评价与改造
2021/03/02 无线电
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
基于php实现的验证码小程序
2016/12/13 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
vue.js实现只弹一次弹框
2018/01/29 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
Python多线程学习资料
2012/12/19 Python
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
python实现挑选出来100以内的质数
2015/03/24 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
Python各种扩展名区别点整理
2020/02/27 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
应届生英语教师求职信
2013/11/05 职场文书
优秀员工获奖感言
2014/03/01 职场文书
社区戒毒工作方案
2014/06/04 职场文书
2014年工商所工作总结
2014/12/09 职场文书
大连导游词
2015/02/12 职场文书
答谢酒会主持词
2015/07/02 职场文书
运动会广播稿20字
2015/08/19 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库