Python json error xx is not JSON serializable solution

  • 2020-05-26 09:37:21
  • OfStack

Python json error xx is not JSON serializable solution

When using json, you often encounter xxx is not JSON serializable, which means you cannot serialize certain objects. Those of you who use django a lot know that django has a built-in Encoder to serialize common objects such as time. We can actually define the serialization of a particular type of object, so let's see how to define and use it.


#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#json_extention 
#2014-03-16 
#copyright: orangleliu 
#license: BSD 
 
''''' 
python In the dumps The method is very easy to use, you can directly put our dict Direct serialization to json object  
 But sometimes we add 1 Some custom classes will not be serialized  
 The custom 1 Some serialization methods  
 
 Reference:  
http://docs.python.org/2.7/library/json.html 
 
 For example, : 
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) 
 
''''' 
 Output results:  
 
PS D:\code\python\python_abc> python .\json_extention.py 
{"date": "2014-03-16 13:56:39.003000", "num": 1112} 
''' 
 
# We customize it 1 A kind of try  
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"} 
 
''' 

Define the handler by inheriting a subclass of json.JSONEncoder, and use it by adding a custom handler to the cls function of the dumps method.

Thank you for reading, I hope to help you, thank you for your support of this site!


Related articles: