python之json扩展

本文介绍如何通过扩展Python的JSONEncoder类来创建自定义的序列化器,以支持复数和其他不可序列化的对象。文章提供了详细的代码示例,展示了如何处理可迭代对象和复数的序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/env python
# -*- coding: utf8 -*-
# __Author: "Skiler Hao"
# date: 2017/4/9 15:26
import json
from json.encoder import JSONEncoder


class SkilerEncoder(JSONEncoder):
    """
    默认的json只支持以下内容的序列化,我们可以对原装json的JsonEncoder作进一步扩展
    +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+
        To extend this to recognize other objects, subclass and implement a
    ``.default()`` method with another method that returns a serializable
    object for ``o`` if possible, otherwise it should call the superclass
    implementation (to raise ``TypeError``).
    补充一下,o是啥?o就是我们平常使用的时候json.dumps(object),放入sumps的对象简称o
    翻译以下官方的哈:
    要扩展json识别更多的对象,需要创建JSONEncoder一个子类。实现default()方法
    default方法,可以对某样扩展的对象处理,返回可以序列化的对象
    要么继承父类的default()方法(内容为Type error 当前对象不可实例化)
#     """
    def default(self, o):
        """
        来自官方文档的例子,实现对可迭代对象的序列化,我仅仅是搬运工,扩展还是交给大家吧
        For example, to support arbitrary iterators, you could
        implement default like this::

            def default(self, o):
                try:
                # 如果传递的是可以可以转化为可迭代的对象,那就转化
                    iterable = iter(o)

                except TypeError:
                # 如果转化失败,啥都不做,交给最好一行,父类处理(抛出类型异常)
                    pass
                else:
                # 否则就将其转化为list对象list对象是可以用默认json序列化的
                    return list(iterable)
                # Let the base class default method raise the TypeError
                # 调用父类的default方法
                return JSONEncoder.default(self, o)

        """

        try:
            if isinstance(o, complex):
                return str(o.real)+ '+' + str(o.imag) + 'j'
            # 例如复数是不能转化的,我们将其转化为字符串
            # 如果传递的是可以可以转化为可迭代的对象,那就转化

            # 如果对象是iterable我们可以将其转化为iter(o)转化为可迭代对象
            iterable = iter(o)

        except TypeError:
            # 如果转化失败,啥都不做,交给最好一行,父类处理(抛出类型异常)
            pass
        else:
            # 否则就将其转化为list对象list对象是可以用默认json序列化的
            return list(iterable)
        # Let the base class default method raise the TypeError
        # 调用父类的default方法
        return JSONEncoder.default(self, o)

if __name__ == '__main__':
    a = [x for x in range(1,10)]
    b= 1 + 2j

    c = json.dumps(a,cls=SkilerEncoder)
    d = json.dumps(b,cls=SkilerEncoder)
    print(b)

 

转载于:https://www.cnblogs.com/skiler/p/6831769.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值