• python之json扩展


    #!/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)
  • 相关阅读:
    Linux 基础 —— RPM
    mysql主从复制
    mysql.user表中Host为%的含义
    MySQL + Atlas --- 部署读写分离(参考02)
    MySQL读写分离技术(参考)
    蚁群算法
    java 回调
    java 接口sort comparable
    matlab 求解高阶方程
    matlab 求解常微分方程
  • 原文地址:https://www.cnblogs.com/skiler/p/6831769.html
Copyright © 2020-2023  润新知