一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2017-06-29 编辑:简简单单 来源:一聚教程网

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()

----> 1 json.dumps(json_1)

  

TypeError: datetime.datetime(2014, 3, 16, 13, 47, 37, 353000) is not JSON serial

izable

'''

  

fromdatetimeimportdatetime

importjson

  

classDateEncoder(json.JSONEncoder ):

  defdefault(self, obj):

    ifisinstance(obj, datetime):

      returnobj.__str__()

    returnjson.JSONEncoder.default(self, obj)

  

json_1={'num':1112,'date':datetime.now()}

printjson.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}

'''

  

#我们自定义一个类试试

classUser(object):

  def__init__(self, name):

    self.name=name

  

classUserEncoder(json.JSONEncoder):

  defdefault(self, obj):

    ifisinstance(obj, User):

      returnobj.name

    returnjson.JSONEncoder.default(self, obj)

  

json_2={'user':User('orangle')}

printjson.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函数中添加自定义的处理方法。

热门栏目