Python3运行报错:TypeError: Object of type ‘type‘ is not JSON serializable解决方法

问题描述:

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

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

这个问题是由于json.dumps()函数引起的。 dumps是将dict数据转化为str数据,但是dict数据中包含byte、int、float、datetime等等的时候,数据所以会报错。

可能会遇到TypeError: Object of type xxx is not JSON serializable错误,也就是无法序列化某些对象格式。

注意:json默认支持的类型只有下面几种,其他的类型,比如自定义的类或者date类型,都需要自定义jsonEncoder。

    Supports the following objects and types by default:
 
    +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+

解决办法:

默认的编码函数很多数据类型都不能编码,自定义序列化,因此可以自己写一个Myencoder去继承json.JSONEncoder,具体如下:

1.MyEncoder.py

import json
class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            print("MyEncoder-datetime.datetime")
            return obj.strftime("%Y-%m-%d %H:%M:%S")
        if isinstance(obj, bytes):
            return str(obj, encoding='utf-8')
        if isinstance(obj, int):
            return int(obj)
        elif isinstance(obj, float):
            return float(obj)
        #elif isinstance(obj, array):
        #    return obj.tolist()
        else:
            return super(MyEncoder, self).default(obj)

2.调用封装的模块来转换字符串

from MyEncoder import MyEncoder
json.dumps(data,cls=MyEncoder,indent=4)
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值