如何对Python的类对象进行序列化处理(Object of type 'BookCollection' is not JSON serializable)

 

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。

json.dumps()         将Python中的对象转换为JSON中的字符串对象
json.loads()         将JSON中的字符串对象转换为Python中的对象

 

我们先看看如何把Python对象变成一个JSON,转换后的JSON对象,最后都是字符串型。

但是如果是类对象,是不是可以可以直接用json.dumps(obj)来处理呢?比如像下面一个简单类:

运行之后会报下面TypeError: 说该对象非JSON的序列化对象

错误的原因是Man对象不是一个可序列化为JSON的对象。如果连class的实例对象都无法序列化为JSON,这肯定不合理!我们仔细看看dumps()方法的参数列表,可以发现,除了第一个必须的obj参数外,dumps()方法还提供了一大堆的可选参数:

>>> help(json.dumps)
Help on function dumps in module json:

dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)

 

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

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

或者通过一种简单的方式,用lambda方式来转换任意一个类对象为JSON形式:

lambda obj: obj.__dict__          会将任意的对象,转换成字典的方式

sort_keys=True                    会按照字典中的键来按照ASCII方式来排序

indent=4                          会按照键值对以间隔4来直观的显示

同样的道理,如果要将JSON对象反序列化,也可以写个函数来转换:

son.loads(json_str, object_hook=handle)

从上面的操作,基本上就完成了从JSON字符串方式到类对象的处理.

json.dumps()函数的详细说明

>>> help(json.dumps)
Help on function dumps in module json:

dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)

 

#  函数作用:       将Python的对象转变成JSON对象

#  skipkeys:       如果为True的话,则只能是字典对象,否则会TypeError错误, 默认False

#  ensure_ascii:   确定是否为ASCII编码

#  check_circular: 循环类型检查,如果为True的话

#  allow_nan:      确定是否为允许的值

#  indent:         会以美观的方式来打印,呈现

#  separators:     对象分隔符,默认为, 

#  encoding:       编码方式,默认为utf-8     

#  sort_keys:      如果是字典对象,选择True的话,会按照键的ASCII码来排序    

 

最后总结】      

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


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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常发生在尝试将一个类型为"cleanmailresult"的Python对象转化为JSON格式时。它的原因可能是这个自定义对象没有实现JSON序列化的方法。 在Python中,JSON序列化是将一个对象转化为JSON格式的过程,以便可以在不同的系统之间进行数据传输和存储。然而,并不是所有的Python对象都可以直接被JSON序列化,只有那些内置的数据类型(如dict、list、str等)或者实现了JSON Encoder和Decoder方法的对象才可以被序列化。 解决这个问题的常见方法之一是实现一个自定义的JSON Encoder来处理这个对象的序列化。具体步骤包括: 1. 创建一个继承自`json.JSONEncoder`的自定义编码器类。 2. 在编码器类中,重写`default`方法,该方法会在遇到无法序列化的对象时被调用。 3. 在`default`方法中,判断对象的类型,如果是"cleanmailresult"类型的对象,则返回一个可以被JSON序列化的代表对象的字典。 4. 在使用`json.dumps()`函数时,指定`cls`参数为这个自定义的编码器类。 下面是一个示例代码: ```python import json class CleanMailResultEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, cleanmailresult): return obj.to_json() # 假设cleanmailresult对象有一个to_json()方法返回可序列化的字典 return super().default(obj) result = cleanmailresult() json_str = json.dumps(result, cls=CleanMailResultEncoder) ``` 通过实现一个自定义的JSON编码器类,我们可以将"cleanmailresult"对象转化为JSON格式。请注意,这里的示例代码中的`to_json()`方法是一个假设的方法,你需要根据实际情况来实现这个方法返回可序列化的字典。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值